2014-05-20 18 views
0

我在现有的一个目录类型网站的mysql数据库中有4个表。 表mt_links包含每个上市 表mt_cl包含上述上市是在哪个类别(我只想CAT_ID = 1) 表mt_cfvalues包含更多的信息对每个上市它可以有重复的值 表mt_images基本信息中包含的图片名称为每个列表。从多个表中检索记录有些不同,有些没有

我想从mt_links的所有记录mt_cl cat_id = 1,并且对于每个记录,我需要mt_cfvalues和cf_images中与link_id匹配的所有记录。

我设置了一个带有Group_Concat的选择并留下了连接,但最终在结果中重复了值。我添加了Distinct,它可以治愈重复值,但mt_cfvalues可以具有相同值的记录,所以现在我缺少了我应该拥有的值。

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      GROUP_CONCAT(DISTINCT b.value ORDER BY b.cf_ID) AS details, 
      GROUP_CONCAT(DISTINCT c.filename ORDER BY c.ordering) AS images 
FROM  mt_links a 
LEFT JOIN mt_cfvalues b ON a.link_id = b.link_ID 
LEFT JOIN mt_images c ON b.link_id = c.link_ID 
LEFT JOIN mt_cl d ON a.link_id = d.link_ID WHERE d.cat_ID = '1' 
GROUP BY a.link_id 

我放在一起这里SQLFiddle:http://www.sqlfiddle.com/#!2/f39e9/1

是否有更简单的方法?我如何解决重复/不重复的问题?

+0

当您遇到重复值时会发生什么? – James

+0

我的结果中应包含来自mt_cfvalues的重复值。在我的小提琴中注意,链接ID 1 ...在细节列中它应该已经返回“好,没有猫,好” – DaveS

回答

0

这是实现你所寻求的一种方法。因为这两个子查询返回独立的结果,所以不能合并GROUP BY,这就是为什么你得到重复。

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      cvf.details, 
      imgs.images 
FROM  mt_links a 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(value ORDER BY cf_ID) AS details 
    FROM mt_cfvalues 
    GROUP BY link_ID 
) cvf ON cvf.link_ID = a.link_id 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(filename ORDER BY ordering) AS images 
    FROM mt_images 
    GROUP BY link_ID 
) imgs ON imgs.link_ID = a.link_id 
INNER JOIN mt_cl d ON a.link_id = d.link_ID 
WHERE d.cat_ID = '1' 
+0

谢谢詹姆斯。这正是我需要的 – DaveS

相关问题