Résultat de la table de jointure SQL de 2 instructions

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:

  • Posts où la méta_key "gtp_product_dont_show" existe et où la valeur meta_ n'est pas "true".
  • Et les messages où la méta_key "gtp_product_dont_show" n'existe pas.

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.