2011-01-07 3 views
2

Il s'agit d'une installation wordpress, mais je pense que la question est plus d'une question SQL générale. Tout d'abord, mes compétences sql ne sont pas géniales (je ne sais même pas si je suis le format correct pour illustrer le db).Sélectionnez toutes les lignes où il n'y a pas de valeur spécifique dans une table différente

J'ai deux tables:

wp_posts : 

    ID (pk) | post_name | ... 
---------------------------- 
    45  | "Hello" 
    91  | "Funny" 
    16  | "Wheat" 

wp_postmeta : 

    post_id (fk) | meta_key  | meta_value | ... 
------------------------------------------------ 
    45   | "_edit_lock" | 5789789834 
    45   | "fizzbizz" | "foobar" 
    91   | "_something" | "teve" 

Je voudrais sélectionner toutes les lignes wp_posts où il n'y a pas de ligne correspondante dans wp_postmeta où meta_key = « fizzbizz »

j'avais à l'origine de cette requête , mais quelqu'un a fait remarquer qu'il ne récupérerait pas ID = '16' dans le cas ci-dessus. Comment est-ce que j'écrirais correctement la requête?

$pageposts = $wpdb->get_results(" 
    SELECT * FROM wp_posts p 
    JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key <> 'fizzbizz' 
    ORDER BY p.post_date DESC; 
"); 

Répondre

3

Utilisez votre requête en cours avec les modifications suivantes:

LEFT JOIN au lieu de JOIN

ajouter

OR m.metakey IS NULL à votre disposition WHERE:

SELECT * FROM wp_posts p 
    LEFT JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key <> 'fizzbizz' 
     OR m.metakey IS NULL 
    ORDER BY p.post_date DESC; 
+0

@JMC Creative - il continue de fonctionner puisque vous avez une ligne qui répond aux critères. Même si vous avez une ligne qui a '' fizzbizz '', vous en avez une autre qui ne l'est pas et cette ligne sera dans votre ensemble d'enregistrements. Voulez-vous que ce soit? – JNK

+0

@JMC Creative - également avec votre modifier votre requête à l'origine fonctionnerait, mais vous devriez toujours utiliser la version modifiée pour tenir compte des enregistrements sans ligne dans la méta tableau – JNK

+0

@JNK, je ne veux pas demander trop ici, mais pouvez-vous expliquer _why_ que je devrais utiliser 'LEFT JOIN'? Je pensais que cela signifie "seulement récupérer les données dans la table GAUCHE". – JakeParis

3
SELECT * FROM wp_posts p 
LEFT JOIN wp_postmeta m 
ON p.ID = m.post_id 
WHERE m.meta_key <> 'fizzbizz' 
OR m.metakey IS NULL 
ORDER BY p.post_date DESC; 

devrait faire l'affaire ;-)

+0

+1 pour votre commentaire! – JNK

Questions connexes