J'essaye d'get des données avec SQL de ma database de WordPress par un JOIN, mais je ne l'obtiens pas fonctionnant.
Ce dont j'ai besoin:
Mon problème:
Je n'ai maintenant que les résultats où les messages ont une méta_key "gtp_product_dont_show", mais il y a aussi des messages qui n'ont pas cette key, et j'en ai besoin aussi.
C'est ce que j'ai maintenant:
SELECT ID, post_title FROM wp_posts p JOIN wp_postmeta m ON p.ID = m.post_id AND m.meta_key = 'gtp_product_dont_show' AND m.meta_value != 'true' WHERE post_type = 'products' AND post_status = 'publish'
Sortie:
Vous avez besoin d'une left join
:
SELECT ID, post_title FROM wp_posts p LEFT JOIN wp_postmeta m ON p.ID = m.post_id AND m.meta_key = 'gtp_product_dont_show' WHERE (m.meta_value is null or m.meta_value <> 'true') and post_type = 'products' AND post_status = 'publish';
La left join
search une key appropriée dans la table wp_postmeta
. La clause where
dit alors "garder un logging quand il n'y a pas de correspondance ou que la valeur n'est pas vraie" – ce qui selon moi est la logique que vous searchz.
Tu cherches ça?
SELECT ID, post_title FROM wp_posts p WHERE post_type = 'products' AND post_status = 'publish' AND not exists ( select 1 from wp_postmeta m where p.ID = m.post_id AND m.meta_key = 'gtp_product_dont_show' AND m.meta_value = 'true')
Cela va chercher toutes les lignes de wp_posts, mais omettre celles où row est trouvé depuis wp_postmeta où meta_key est gtp_product_dont_show et la valeur est true.
Vous pouvez utiliser l'opérateur OR
pour prendre en count les deux conditions. Essaye ça:
SELECT stuff FROM myTable JOIN otherTable ON (m.meta_key = 'gtp_product_dont_show' AND m.meta_value != 'true') OR (m.meta_key != 'gtp_product_dont_show') ...
Juste une note de côté, je ne recommand pas de stocker des booleans comme des strings comme ça. Vous devriez envisager d'utiliser un TINYINT()
où les champs booleans sont stockés comme 0 pour faux, ou 1 pour vrai.