2014-12-06 48 views
0

我有两个表Mysql的连接表的结果作为一个行

PRJ

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 

我的查询时,男人和女人的行数已经等于,工作正常 但 我想在任何情况下工作。

非常感谢 和原谅我的英语写作

+0

但是,为什么,哦,为什么? :-( – Strawberry 2014-12-06 12:48:00

+1

为什么man2在结果集中缺失? – Strawberry 2014-12-06 12:56:56

回答

3

只需使用条件汇总:

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小提琴。

请注意建议的输出看起来与输入数据不一致。这将产生输出:

ptitle | men   | women 
prj111 | man1,man2,men3 | woman1 

我看不出有任何合理的方式排除列表man2,所以我认为这是一个错字。

+0

这是我的低调。我不打算评论是无益的。我留下了评论,因为我不想成为匿名downvoter,并想指出错误。但是你是对的,问题通过这个查询来解决。我错了(第一次是!!--))评论删除,回复upvoted。 – GolezTrol 2014-12-06 13:47:36

+0

谢谢。非常好,简单 – Alireza 2014-12-06 16:04:34

0

的“速战速决”将在group_concat聚合使用distinct

SELECT 
    prj.ptitle, 
    group_concat(distinct pflow1.pactiontxt) AS men, 
    group_concat(distinct pflow2.pactiontxt) AS women 
FROM prj 
JOIN prjflow AS pflow1 ON (prj.id = pflow1.pid AND pflow1.paction = 1) 
JOIN prjflow AS pflow2 ON (prj.id = pflow2.pid AND pflow2.paction = 2) 
GROUP BY 
    prj.ptitle -- Officially you'll need this as well, although MySQL is quite forgiving. 

但查询还是使用两个连接,并如果某个项目没有男性或女性,甚至会失败。

所以为了解决这个问题,你可以使用子查询编写查询。这样,你不需要加入distinctgroup by,并且当一个物品根本没有男人或者没有女人时,查询也可以工作。

SELECT 
    prj.ptitle, 
    (SELECT group_concat(pflow1.pactiontxt) FROM prjflo pflow1 
    WHERE prj.id = pflow1.pid AND pflow1.paction = 1) AS men, 
    (SELECT group_concat(pflow2.pactiontxt) FROM prjflo pflow2 
    WHERE prj.id = pflow2.pid AND pflow2.paction = 2) AS women 
FROM prj 
+0

有没有更好的方法? – Strawberry 2014-12-06 12:49:34

+0

噢,有;-) – Strawberry 2014-12-06 12:57:52

相关问题