我有两张 table
pj
id | ptitle
1 | prj111
2 | prj222
prjflow
id | pid | paction | pactiontxt
1 | 1 | 1 | man1
2 | 1 | 1 | man2
3 | 1 | 2 | woman1
4 | 1 | 1 | man3
我想要这个输出:
输出
ptitle | men | women
prj111 | man1,men3 | woman1
我写了这个查询:
SELECT prj.ptitle
, GROUP_CONCAT(pflow1.pactiontxt) men
, GROUP_CONCAT(pflow2.pactiontxt) women
FROM prj
JOIN prjflow pflow1
ON prj.id = pflow1.pid
AND pflow1.paction = 1
JOIN prjflow pflow2
ON prj.id = pflow2.pid
AND pflow2.paction = 2;
但输出是:
ptitle | men | women
prj111 | man1,men3 | woman1,woman1
我的查询当男女行数相等时,正常工作 但 我希望它在任何情况下都有效。
非常感谢 请原谅我糟糕的英文写作
最佳答案
只需使用条件聚合:
SELECT prj.ptitle,
GROUP_CONCAT(CASE WHEN prjflow.paction = 1 THEN prjflow.pactiontext END ORDER BY prjflow.id) as men,
GROUP_CONCAT(CASE WHEN prjflow.paction = 2 THEN prjflow.pactiontext END ORDER BY prjflow.id) as women
FROM prj JOIN
prjflow
ON prj.id = prjflow.pid
GROUP BY prj.ptitle;
这还将解决您的查询的两个潜在问题。首先是性能。如果某些职位有大量男性和女性,则查询必须处理笛卡尔积。二是语义。如果某些标题有男性但没有女性或没有男性的女性,则两个连接将过滤掉它们。
Here是一个演示它的 SQL Fiddle。
请注意,建议的输出似乎与输入数据不一致。这会产生输出:
ptitle | men | women
prj111 | man1,man2,men3 | woman1
我认为没有合理的方法可以将 man2
从列表中排除,因此我认为这是一个打字错误。
关于Mysql连接表结果为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27331731/