Mysql连接表结果为一行

标签 mysql join group-concat

我有两张 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/

相关文章:

php - 如何通过AJAX将Jquery可拖动UI与mysql连接

php - 奇怪的编码问题

mysql - 如何通过 SQL 查询从表中提取最后 5 个条目?

php - 选择链接表中缺少的行

java - 如何在 HQL 更新中使用加入?

mysql - 如何查询记录出现在一张表中,但不出现在另外两张表中

mysql - 如何在单个字段或列中连接多个值? (MySQL)

mysql - 在 Lync 2010 LCSCDR 数据库中,他们是一种判断谁接听了响应组调用的方法

MySQL : Need to short a query

mysql - GROUP CONCAT 一些不同,一些不同