2010-07-30 2 views
2

J'ai deux tables qui représentent les nœuds parents/enfants, leurs types et leurs relations:Interrogation une représentation db MySQL d'un arbre

Tableau 1

| nodeID | node | name | type | 
| 1  | A | test | Type A | 
| 2  | B | abcd | Type B | 
| 3  | C | defg | Type C | 

Tableau 2

| parentNodeID | childNodeID | 
|  1   |  2  | 
|  1   |  3  | 

Je voudrais écrire une requête où je trouve des nœuds enfants de type B qui n'ont pas de parent de type C.

J'ai essayé

select node from table1 t1 left join table2 t2 on t1.nodeID=t2.childNodeID 
    where Type="Type B" 
    and t2.parentNodeID not in (select nodeID from t1 where type="Type C) 

Cela ne fonctionne pas comme prévu. Est-ce que je fais cela correctement? Y a-t-il un moyen plus facile?

+0

Ce qui concerne spécifiquement votre requête ne fonctionne pas comme prévu (je suppose que ce n'est pas la faute de frappe qui donnerait une erreur de syntaxe). Pouvez-vous donner un exemple où votre requête ne parvient pas à donner le bon résultat? –

Répondre

1

Vous pouvez essayer ceci:

SELECT node 
FROM Table1 
WHERE type = 'Type B' 
AND nodeID NOT IN (
    SELECT T2.childNodeID 
    FROM table1 T1 
    JOIN table2 T2 
    ON T2.parentNodeId = T1.nodeId 
    WHERE T1.type = 'Type C' 
) 

Cela signifie quelque chose comme ceci: Trouver tous les nœuds de type b qui ne sont pas l'un des (les nœuds enfants qui ont un nœud parent de type c).