2012-07-31 1 views
1

Nous utilisons un modèle hybride de jeux imbriqués pour permettre à un enfant d'avoir plusieurs parents. Il s'agit d'une extension du modèle de jeu imbriqué décrit dans le blog Mike Hillyers: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - cela pourrait aider à expliquer certains des noms de colonnes. Je suis assez nouveau à SQL mais j'ai étudié des jointures, des sous-requêtes etc. et rien ne semble m'offrir le résultat dont j'ai besoin. Je m'attends à la réponse est assez simple et sera presque certainement un LEFT JOIN mais je ne peux pas mettre le doigt dessus.Utilisation des résultats d'une requête dans une autre

J'ai une table simple appelée 'nested_parts' avec 5 colonnes: 'tree_id', 'part_id', 'lft', 'rgt' et 'mapping'.

La requête suivante renvoie les valeurs que je souhaite comparer dans la deuxième requête.

SELECT * FROM nested_parts WHERE part_id = 125 

Plus précisément, je sais maintenant qui est tree_id cette partie # 125 existe et les valeurs de LFT et Rgt pour chaque tree_id.

Maintenant, j'ai besoin de connaître tous les part_id qui se trouvent dans le tableau des résultats de tree_id que j'ai tirés plus tôt.

J'ai utilisé cette sous-requête pour cela:

SELECT * FROM nested_parts 
WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125) 

Maintenant je dois savoir qui de part_id ont LFT et les valeurs TGB qui ne sont pas entre les valeurs de LFT et Rgt de la partie n ° 125 dans le cadre de chaque tree_id . Ce serait facile si j'avais deux tables à comparer, ou si je pouvais utiliser des tables virtuelles mais cela ne semble pas possible ici sans boucle. Toute aide reçue avec gratitude, mais s'il vous plaît apprécier que je suis stupide pas paresseux, et bien que j'ai lu beaucoup sur UNIONS, JOINS, AYANT, O WH, SELECT (SELECT), avec la complexité des données sur le dessus, je trouve c'est extrêmement déroutant.

Cordialement,

James

+0

Hey James, pouvez-vous mettre sqlfiddle @: http://sqlfiddle.com/ –

+0

Ceci est une excellente question , bien que libellé un peu confus à la fin là. – Matt

+0

J'ai supprimé la balise PHP car, bien que vous l'implémentiez en PHP, c'est une question mysql. – Matt

Répondre

1

Bien que je recommande revisiter votre architecture de données, je vais essayer de vous aider à obtenir ce problème résolu. D'abord, revenons à JOIN. Votre requête

SELECT * FROM nested_parts WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125) 

peut être simplifiée avec un JOIN

SELECT np.* FROM nested_parts AS np 
INNER JOIN nested_parts AS np2 
ON np.tree_id = np2.tree_id 
AND np2.part_id = 125 

Je répondrai un peu plus complètement après avoir fini de lire la question et bien comprendre. J'espère que cela aide pour le moment.

MISE À JOUR:

Afin d'obtenir uniquement les enregistrements où les LFT et rgt valeurs ne sont pas entre les LFT et rgt valeurs de pièce n ° 125, vous devez utiliser la HAVING condition.

SELECT np.* FROM nested_parts AS np 
INNER JOIN nested_parts AS np2 
ON np.tree_id = np2.tree_id 
AND np2.part_id = 125 
HAVING np.lft > np2.rgt 
    AND np.rgt < np2.lft 

Si ma logique est mauvaise ici, faites le moi savoir. I pense c'est ce que vous cherchez, cependant.

EDIT:

Votre requête peut également combiner des conditions pour le rejoindre

SELECT np.* FROM nested_parts AS np 
INNER JOIN nested_parts AS np2 
ON np.tree_id = np2.tree_id 
AND np2.part_id = 125 
AND np.lft > np2.rgt 
AND np.rgt < np2.lft 
+0

Vous êtes un gentleman et un érudit. Je vous remercie beaucoup pour votre aide. J'avais essayé des jointures similaires mais je ne savais pas que vous pouviez utiliser np. * Et AS ensemble ainsi que l'utilisation de AND sur la seconde partie de l'auto-jointure qui rend l'auto-jointement utilisable. J'ai juste inversé les valeurs intermédiaires pour changer la logique mais votre réponse était parfaite. SELECT np. * FROM nested_parts AS np INNER JOIN nested_parts AS NP2 SUR np.tree_id = np2.tree_id ET np2.part_id = 125 ET np.lft np2.rgt –

+0

@JamesPitt Merde, ça a marché?! Je viens de prendre une photo dans le noir! – Matt

+0

@ JamesPitt Sérieusement, comprenez-vous ce qui se passe là-bas? – Matt

Questions connexes