将列作为分隔列表加入MySQL查询

时间:2013-04-02 15:32:28

标签: mysql sql

我在MySQL中有一个表,如下所示:

date      | name    | status
03-13-2014,Bob Jones,Pending
03-13-2014,George Manuel,Pending
03-13-2014,Tom Grables,Pending
03-13-2014,Frankie Avalon,Approved
03-13-2014,Robert Garcia,Approved
03-14-2014,John Doe,Pending
03-14-2014,John Die,Approved
03-14-2014,John Zoe,Approved

我要做的是获取所有批准的行的日期,名称和状态。但是,我也希望以这样一种方式加入此查询,即我抓取的每一行也都有一个以分号分隔的列表,其中包含状态为待定的那些名称,并且与批准的日期相同。因此,我的查询输出看起来像这样:

03-13-2014,Frankie Avalon,Approved,Bob Jones;George Manuel;Tom Grables
03-13-2014,Robert Garcia,Approved,Bob Jones;George Manuel;Tom Grables

请注意,我抓住了2014年3月13日的已批准请求,并添加了状态为待处理且其日期与已批准请求匹配的请求作为列。我一直在搞乱加入声明,并完成我的谷歌作业,但还没有找到办法做到这一点。

非常感谢任何想法。

2 个答案:

答案 0 :(得分:1)

查看group_concat()

SELECT
    GROUP_CONCAT('name` SEPARATOR ',') as NameList
FROM
    `tablename`
GROUP BY
    `date`

答案 1 :(得分:1)

我认为这是你想要的逻辑:

 select `date`,
         group_concat( (case when status = 'Approved' then name end) separator ';') as Approveds,
         group_concat( (case when status = 'Pending' then name end) separator ';') as Pendings
 from t
 group by `date`;

如果您确实希望在没有批准的日期暂挂 ,那么您需要一个额外的过滤器:

 select `date`,
         group_concat( (case when status = 'Approved' then name end) separator ';') as Approveds,
         group_concat( (case when status = 'Pending' then name end) separator ';') as Pendings
 from t
 group by `date`
 having `date` in (select `date` from t where status = 'Approved')