从多个表中检索一些不同的记录,一些不是

时间:2014-05-20 15:09:48

标签: mysql sql

我在目录类型站点的现有mysql数据库中有4个表。 表mt_links包含每个列表的基本信息 表mt_cl包含上面哪个列表属于哪个类别(我只想要cat_id = 1) 表mt_cfvalues包含每个列表的更多详细信息它可以具有重复值 表mt_images包含每个列表的图像名称。

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

我使用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

有更简单的方法吗?如何解决重复/无重复问题?

1 个答案:

答案 0 :(得分: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'