【问题标题】:Conditions in MySQL GROUP_CONCATMySQL GROUP_CONCAT 中的条件
【发布时间】:2012-04-08 06:58:03
【问题描述】:

我有一个带有请求的 MySQL 表

+--------+-------------+-----+
| req_id | req_name    | ... |
+--------+-------------+-----+
| 1      | testrequest | ... |
+--------+-------------+-----+

以及对此类请求进行投票的表格。

+--------+-----------+----------+
| req_id | vote_name | approved |
+--------+-----------+----------+
| 1      | User1     | 1        |
| 1      | User2     | 1        |
| 1      | User3     | 1        |
| 1      | User4     | 0        |
| 1      | User5     | 0        |
+--------+-----------+----------+

我想要的那种视图:

+--------+-------------+---------------------+--------------+
| req_id | req_name    | approved_by         | rejected_by  |
+--------+-------------+---------------------+--------------+
| 1      | testrequest | User1, User2, User3 | User4, User5 |
+--------+-------------+---------------------+--------------+

然而,到目前为止,我只能做到这一点:

+--------+-------------+----------+---------------------+
| req_id | req_name    | approved | by                  |
+--------+-------------+----------+---------------------+
| 1      | testrequest | YES      | User1, User2, User3 |
| 1      | testrequest | NO       | User4, User5        |
+--------+-------------+----------+---------------------+

我使用的查询:

SELECT requests.req_id, req_name, CASE
        WHEN approved THEN 'YES'
        ELSE 'NO'
        END AS approved, GROUP_CONCAT(vote_name ORDER BY vote_name ASC SEPARATOR ', ') AS by
FROM requests
LEFT JOIN votes ON requests.req_id = votes.req_id
GROUP BY requests.req_id, approved
ORDER BY requests.req_id DESC;

所以我的问题是,如何在同一行中获得 2 个具有不同值的 group_concats?

非常感谢!

【问题讨论】:

  • Order by 正在与 group_concat 合作

标签: mysql group-by group-concat


【解决方案1】:

试试这个:

select r.req_id, r.req_name,
  group_concat(if(approved, vote_name, null) separator ', ') approvedBy,
  group_concat(if(approved, null, vote_name) separator ', ') rejectedBy
from requests r
left join votes v on r.req_id = v.req_id

结果:

+--------+-------------+---------------------+--------------+
| REQ_ID |  REQ_NAME   |     APPROVEDBY      |  REJECTEDBY  |
+--------+-------------+---------------------+--------------+
|      1 | testrequest | User1, User2, User3 | User4, User5 |
+--------+-------------+---------------------+--------------+

【讨论】:

    【解决方案2】:

    我尝试在另一个查询中重复使用您的查询

    SELECT req_id,
       req_name,
       GROUP_CONCAT(case approved when 'YES' then voted_by else null end SEPARATOR ', ') AS approved_by,
       GROUP_CONCAT(case approved when 'NO' then voted_by else null end SEPARATOR ', ') AS rejected_by
    FROM
    (
    SELECT requests.req_id, req_name, CASE
        WHEN approved THEN 'YES'
        ELSE 'NO'
        END AS approved, 
        GROUP_CONCAT(vote_name ORDER BY vote_name ASC SEPARATOR ', ') AS voted_by
    FROM requests
    LEFT JOIN votes ON requests.req_id = votes.req_id
    GROUP BY requests.req_id, approved
    ORDER BY requests.req_id DESC
    ) t
    group by req_id
    

    【讨论】:

    • 感谢您的快速回复!您认为不使用子查询就可以实现这一目标吗?因为如果我没记错的话,MySQL 不允许视图的 FROM 子句中的子查询..
    • 嗯,好的。将不得不调查它。
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2015-07-08
    • 2012-01-13
    • 2015-04-28
    • 1970-01-01
    • 2011-01-31
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多