2010-08-20 107 views
0

我有以下SQL查詢至極選擇從3個表「工作」,「媒體」和「work_media」SQL選擇問題

我希望所有與其相關媒體1的工作,下面的SQL查詢的結果這樣做。 但它只返回實際上有媒體鏈接的工作,這不是我想要的,我也希望返回沒有媒體附加的工作。 我該怎麼實現呢?

選擇workidworktitleworkfile_name_thumb FROM workmediamedia_work WHERE media_workwork_id = work.id AND media_workmedia_id = media.id GROUP BY workid ORDER BY workid DESC

回答

0

應使用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將包括表中的所有行其左邊即使右表中沒有相應的行。但要小心,缺少的行將被NULL填充。

+0

謝謝!其作品!!!!所有這些快速反應!大! – waterschaats 2010-08-20 17:06:12

+0

還有一種方法可以選擇附加到作品的所有媒體嗎? – waterschaats 2010-08-20 17:33:46

0

您需要使用OUTER JOIN。

0

使用這個LEFT OUTER JOIN

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

我同意這個解決方案。通過使用LEFT OUTER JOIN,您的結果將顯示工作表中的所有記錄,即使它們沒有指向其他表的鏈接。 – dvanaria 2010-08-20 16:53:32

+0

非常感謝,我會盡力的! – waterschaats 2010-08-20 16:54:07

+0

除了'mw.media_id = m.id'外,其他查詢都完全相同。我想那些偉大的思想家都會這麼想。 ;-) – 2010-08-20 17:00:11

0

你應該嘗試這樣的事:

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; 

真的不知道你想要的究竟是什麼,如果你想看到所有工作,即使那些沒有媒體,這將工作正常,否則第一LEFT JOIN應該是RIGHT JOIN

+0

順便說一句,這部分代碼使媒體的別名(米)? 'LEFT JOIN media m' – waterschaats 2010-08-20 17:26:19

+0

是的,它的確如此。它只是'media AS m'的較短版本。 – 2010-08-20 17:54:20