2010-08-20 6 views
0

Je donne les résultats suivants Wich requête SQL sélectionne un résultat de 3 tables de travail », « médias » et « work_media »SQL Select Question

Je veux tout le travail avec 1 de ses supports associés, la requête SQL suivante est-ce que. Mais il ne retourne que le travail qui a réellement des médias liés et ce n'est pas ce que je veux, je veux aussi le travail retourné qui n'a pas de média attaché à elle. Comment puis-je accomplir cela?

SELECT work. id, work. title, work. file_name_thumb DE work, media, media_work O WH media_work. work_id = work.id ET media_work. media_id = media.id GROUPE PAR work. id COMMANDER PAR work. id DESC

Répondre

0

Vous devez utiliser OUTER JOIN:

SELECT work.id, work.title, work.file_name_thumb FROM work 
LEFT OUTER JOIN media_work ON media_work.work_id = work.id 
LEFT OUTER JOIN media ON media_work.media_id = media.id 
GROUP BY work.id ORDER BY work.id DESC; 

LEFT OUTER JOIN comprendra toutes les lignes de la table à sa gauche, même s'il n'y a pas de ligne correspondante dans la table de droite. Attention cependant, que la ligne manquante sera remplie avec des valeurs nulles.

+0

Merci! ça marche!!!! Toutes ces réponses rapides! Génial! – waterschaats

+0

Y a-t-il également un moyen de sélectionner tous les médias attachés à l'œuvre? – waterschaats

0

Vous devez utiliser un OUTER JOIN.

0

Utilisez un LEFT OUTER JOIN pour cela:

SELECT w.id, w.title, w.file_name_thumb 
FROM work w 
LEFT OUTER JOIN media_work mw ON mw.work_id = w.id 
LEFT OUTER JOIN media m ON mw.media_id = m.id 
GROUP BY w.id 
ORDER BY w.id DESC 
+0

Je suis d'accord avec cette solution. En utilisant LEFT OUTER JOIN, votre résultat affichera tous les enregistrements de la table de travail même s'ils n'ont pas de lien vers les autres tables. – dvanaria

+0

Merci beaucoup, je vais essayer ça! – waterschaats

+0

Exactement la même requête à l'exception de 'mw.media_id = m.id'. Je suppose que les grands esprits se ressemblent. ;-) –

0

Vous devriez essayer quelque chose comme ceci:

SELECT w.id, w.title, w.file_name_thumb 
FROM work w 
LEFT JOIN media_work mw ON mw.work_id = w.id 
LEFT JOIN media m ON m.id = mw.media_id 
GROUP BY w.id 
ORDER BY w.id DESC; 

Je ne sais pas vraiment ce que vous voulez exactement, si vous voulez voir tous le travail , même ceux sans médias cela fonctionnerait bien, sinon le premier LEFT JOIN devrait être un RIGHT JOIN.

+0

btw cette partie du code fait-elle un alias (m) de média? 'LEFT JOIN media m' – waterschaats

+0

Oui, c'est le cas. C'est juste une version plus courte de 'media AS m'. –