我有一个表“项目”,该表可以与多个“程序”和“主题”相关联。当我(按program)查询项目时,我想要的是在结果集中获得1行,其中程序ID和主题ID集中在1个字段中。如果可能的话,我不知道该怎么做。谁能为我提供一些建议,以避免在结果集中的不同行中看到程序和主题的每个组合而产生行乘法效果?
答案 0 :(得分:1)
听起来好像您正在体验Cartesian product,因为程序和主题之间没有直接关联。
如果您要用逗号分隔的程序列表或主题列表,可以使用GROUP_CONCAT()。但是每个程序和每个主题只有一个表达式。
SELECT item.*,
GROUP_CONCAT(program.some_col) AS clummped_programs,
GROUP_CONCAT(topic.some_col) AS clumped_topics
FROM item
LEFT JOIN program ON ...
LEFT JOIN topic ON ...
GROUP BY item.id
但是运行多个查询来避免使用笛卡尔乘积是更简单,更可维护的。
SELECT item.*, program.*
FROM item
LEFT JOIN program ON ...
SELECT item.*, topic.*
FROM item
LEFT JOIN topic ON ...
试图使所有内容在单个SQL查询中正常工作很诱人,但有时这不是解决问题的正确方法。