Mysql 无条件群Concat

Mysql 无条件群Concat,mysql,group-concat,Mysql,Group Concat,我正试图重写我的查询以使用列而不是行。我有一个疑问: mysql> SELECT r.id as responseId, a.id as answerId, o.id, optionId, q.label as questionLabel, o.label as optionLabel -> FROM answer a -> INNER JOIN question q ON questionId = q.id -> INNER JOIN answe

我正试图重写我的查询以使用列而不是行。我有一个疑问:

mysql> SELECT r.id as responseId, a.id as answerId, o.id, optionId, q.label as questionLabel, o.label as optionLabel
    -> FROM answer a
    -> INNER JOIN question q ON questionId = q.id
    -> INNER JOIN answer_options_option ao ON a.id = ao.answerId
    -> INNER JOIN `option` o ON ao.optionId = o.id
    -> INNER JOIN response r ON a.responseId = r.id
    -> ORDER BY r.id, a.id, o.id;
mysql> SELECT r.id as responseId,
    -> IF(q.label = 'Q1', GROUP_CONCAT(o.label), NULL) as Q1,
    -> IF(q.label = 'Q2', GROUP_CONCAT(o.label), NULL) as Q2
    -> FROM answer a
    -> INNER JOIN question q ON questionId = q.id
    -> INNER JOIN answer_options_option ao ON a.id = ao.answerId
    -> INNER JOIN `option` o ON ao.optionId = o.id
    -> INNER JOIN response r ON a.responseId = r.id
    -> GROUP BY r.id;
这给了我这个输出:

+------------+----------+----+----------+---------------+-------------+
| responseId | answerId | id | optionId | questionLabel | optionLabel |
+------------+----------+----+----------+---------------+-------------+
|          1 |        1 |  2 |        2 | Q1            | no          |
|          1 |        2 |  4 |        4 | Q2            | b           |
|          2 |        3 |  1 |        1 | Q1            | yes         |
|          2 |        4 |  3 |        3 | Q2            | a           |
|          2 |        4 |  4 |        4 | Q2            | b           |
|          2 |        4 |  5 |        5 | Q2            | c           |
+------------+----------+----+----------+---------------+-------------+
+------------+-----------+-------+
| responseId | Q1        | Q2    |
+------------+-----------+-------+
|          1 | no        | b     |
|          2 | yes       | a,b,c |
+------------+-----------+-------+
但我希望得到以下输出:

+------------+----------+----+----------+---------------+-------------+
| responseId | answerId | id | optionId | questionLabel | optionLabel |
+------------+----------+----+----------+---------------+-------------+
|          1 |        1 |  2 |        2 | Q1            | no          |
|          1 |        2 |  4 |        4 | Q2            | b           |
|          2 |        3 |  1 |        1 | Q1            | yes         |
|          2 |        4 |  3 |        3 | Q2            | a           |
|          2 |        4 |  4 |        4 | Q2            | b           |
|          2 |        4 |  5 |        5 | Q2            | c           |
+------------+----------+----+----------+---------------+-------------+
+------------+-----------+-------+
| responseId | Q1        | Q2    |
+------------+-----------+-------+
|          1 | no        | b     |
|          2 | yes       | a,b,c |
+------------+-----------+-------+
所以我提出了这个问题:

mysql> SELECT r.id as responseId, a.id as answerId, o.id, optionId, q.label as questionLabel, o.label as optionLabel
    -> FROM answer a
    -> INNER JOIN question q ON questionId = q.id
    -> INNER JOIN answer_options_option ao ON a.id = ao.answerId
    -> INNER JOIN `option` o ON ao.optionId = o.id
    -> INNER JOIN response r ON a.responseId = r.id
    -> ORDER BY r.id, a.id, o.id;
mysql> SELECT r.id as responseId,
    -> IF(q.label = 'Q1', GROUP_CONCAT(o.label), NULL) as Q1,
    -> IF(q.label = 'Q2', GROUP_CONCAT(o.label), NULL) as Q2
    -> FROM answer a
    -> INNER JOIN question q ON questionId = q.id
    -> INNER JOIN answer_options_option ao ON a.id = ao.answerId
    -> INNER JOIN `option` o ON ao.optionId = o.id
    -> INNER JOIN response r ON a.responseId = r.id
    -> GROUP BY r.id;
但是它给了我这个输出:

+------------+-----------+------+
| responseId | Q1        | Q2   |
+------------+-----------+------+
|          1 | no,b      | NULL |
|          2 | yes,a,b,c | NULL |
+------------+-----------+------+
甚至可以这样使用
GROUP\u CONCAT
?有没有其他方法来完成我想做的事情


这里有一个。

您需要将
组\u CONCAT
移动到条件之外,以便根据问题聚合选项,而不仅仅是根据问题值获得整个聚合结果:

SELECT r.id as responseId,
GROUP_CONCAT(CASE WHEN q.label = 'Q1' THEN o.label END ORDER BY o.label) as Q1, 
GROUP_CONCAT(CASE WHEN q.label = 'Q2' THEN o.label END ORDER BY o.label) as Q2
FROM answer a
INNER JOIN question q ON questionId = q.id
INNER JOIN answer_options_option ao ON a.id = ao.answerId
INNER JOIN `option` o ON ao.optionId = o.id
INNER JOIN response r ON a.responseId = r.id
GROUP BY r.id;
输出:

responseId  Q1      Q2
1           no      b
2           yes     a,b,c

感谢您提供小提琴。这使得回答这个问题变得容易多了。