我在目录类型站点的现有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
有更简单的方法吗?如何解决重复/无重复问题?
答案 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'