2010-07-21 5 views
1

I ont 2 tables articles et item_relationsPHP MySQL: Obtenir des lignes du tableau A, où les valeurs de la colonne Z du tableau A pas présent dans la colonne Z de la table B

éléments a 4 colonnes row_id (clé primaire), story_id, field1 et field2

La relation item_relation stocke la relation entre chaque ligne dans la table des éléments. Elle contient 2 colonnes parent_story_id et child_story_id. Les deux colonnes stockent story_id de lignes à partir d'éléments.

Un élément parent peut contenir plusieurs éléments enfants et un enfant peut avoir 1 élément parent ou plus. mais un élément enfant ne peut pas avoir ses propres éléments enfants.

Maintenant, je veux sélectionner des lignes d'éléments pour lesquels items.story_id n'est pas présent dans item_relation.child_story_id

Comment puis-je prendre?

Répondre

3

Je veux sélectionner des lignes à partir d'éléments pour lesquels items.story_id n'est pas présent dans item_relation.child_story_id

Vous pouvez utiliser NOT IN, NOT EXISTS ou LEFT JOIN/OU ... IS NULL.

Un exemple avec NOT IN:

SELECT * 
FROM items 
WHERE items.story_id NOT IN (
    SELECT child_story_id FROM item_relation 
) 

Un exemple avec LEFT JOIN/OU ... IS NULL:

SELECT items.* 
FROM items 
LEFT JOIN item_relation 
ON items.story_id = item_relation.child_story_id 
WHERE item_relation.child_story_id IS NULL 

Un exemple avec NOT EXISTS:

SELECT * 
FROM items 
WHERE NOT EXISTS (
    SELECT NULL 
    FROM item_relation 
    WHERE item_relation.child_story_id = items.story_id 
) 

L'article NOT IN vs. NOT EXISTS vs. LEFT JOIN/IS NULL: MySQL par Quassnoi explique les différences entre ces techniques et compare leur performance. Le résumé:

C'est pourquoi la meilleure façon de rechercher des valeurs manquantes dans MySQL est d'utiliser un LEFT JOIN/IS NULL ou NOT IN plutôt que NOT EXISTS.

Questions connexes