2010-11-19 6 views
0

J'ai un problème avec une requête, le problème est que je suis laissé rejoindre trois fois de la même table.Requête avec plusieurs jointures ne retournera qu'une seule de mes jointures à gauche

La requête en question est la suivante:

SELECT 
     o.order_id, 
     n.title, 
     c.first_name, 
     tdv5.tid, 
     tdv6.name, 
     tdv8.name AS settlement_month 
FROM orders o 
     join products p   on o.product_id = p.nid 
     join node n    on p.nid = n.nid 
     join customers c   on o.customer_email = c.customer_email 
     join term_node tn   on tn.nid = p.nid 
     join term_data tdv6  on tn.tid = tdv6.tid AND tdv6.vid = 6 
     left join term_data tdv5 on tn.tid = tdv5.tid AND tdv5.vid = 5 
     left join term_data tdv8 on tn.tid = tdv8.tid AND tdv8.vid = 8 

Quand j'utilise cette requête que la première jointure en utilisant tn.tid fonctionnera. Pour un exemple si la seule jointure des trois derniers est la suivante:

join term_data tdv6  on tn.tid = tdv6.tid AND tdv6.vid = 6 

Cela fonctionnera bien. La même chose avec

left join term_data tdv5 on tn.tid = tdv5.tid AND tdv5.vid = 5 

Et

left join term_data tdv8 on tn.tid = tdv8.tid AND tdv8.vid = 8 

Cependant quand je les combine, ils ne fonctionneront pas du tout. Seul tdv6 fonctionne quand je combine les trois requêtes.

Avez-vous des suggestions sur ce qui ne va pas? Merci.

Répondre

1

Si vous essayez de mettre une clause WHERE, comme ceci:

SELECT 
     o.order_id, 
     n.title, 
     c.first_name, 
     tdv5.tid, 
     tdv6.name, 
     tdv8.name AS settlement_month 
FROM orders o 
     join products p   on o.product_id = p.nid 
     join node n    on p.nid = n.nid 
     join customers c   on o.customer_email = c.customer_email 
     join term_node tn   on tn.nid = p.nid 
     join term_data tdv6  on tn.tid = tdv6.tid 
     left join term_data tdv5 on tn.tid = tdv5.tid 
     left join term_data tdv8 on tn.tid = tdv8.tid 
WHERE 
     tdv6.vid = 6 and 
     tdv5.vid = 5 and 
     tdv8.vid = 8 
+0

Ensuite, il ne retournera aucune ligne du tout. J'ai besoin de valeurs NULL pour les jointures à gauche qui ne retournent rien. –

+0

Si vous placez la condition dans WHERE, votre gauche rejoindra une jointure interne. – GolezTrol

0

Êtes-vous sûr que vos conclusions sont correctes? Les valeurs nulles apparaîtront sur la même ligne, donc quand il n'y a pas d'enregistrements où term_data.tid = = tn.tid et term_data.vid dans (5, 8), vous obtiendrez seulement les enregistrements pour tdv6. tid et/ou settlement_month seront NULL pour ces enregistrements.

Voulez-vous peut-être aussi rejoindre à gauche tdv6? C'est maintenant une jointure interne, ce qui signifie que vous avez besoin d'un enregistrement dans tdv6 pour obtenir les enregistrements de tdv5 ou tdv8 avec le même TID.

+0

J'ai besoin de toutes les 3 informations des rangées SI elles sont disponibles. Est-ce possible? –

+0

Avez-vous essayé de convertir le (INNER) JOIN sur tdv6 en une jointure à gauche, comme je l'ai suggéré? Cela devrait faire l'affaire. – GolezTrol

Questions connexes