2010-08-20 58 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