MySQL使用条件GROUP_CONCAT按id、day分组后拆分class对应结果为多列
MySQL 条件GROUP_CONCAT行转列解决方案
原写法问题说明
之前的查询结果所有class列值相同,是因为子查询没有添加对应class的过滤规则,会把当前id+day分组下所有class的results全部拼接,没有按class区分。
正确查询SQL
SELECT id, day, GROUP_CONCAT(CASE WHEN class = 1 THEN results END SEPARATOR '<br>') AS class1, GROUP_CONCAT(CASE WHEN class = 2 THEN results END SEPARATOR '<br>') AS class2, GROUP_CONCAT(CASE WHEN class = 3 THEN results END SEPARATOR '<br>') AS class3, GROUP_CONCAT(CASE WHEN class = 4 THEN results END SEPARATOR '<br>') AS class4, GROUP_CONCAT(CASE WHEN class = 5 THEN results END SEPARATOR '<br>') AS class5, GROUP_CONCAT(CASE WHEN class = 6 THEN results END SEPARATOR '<br>') AS class6 FROM Table1 GROUP BY id, day ORDER BY FIELD(day,'monday','tuesday','wednesday','thursday','friday','saturday','sunday')
实现逻辑说明
- 核心是条件聚合思路:在
GROUP_CONCAT内部通过CASE WHEN过滤对应class的结果,非目标class的行返回NULL,GROUP_CONCAT会自动忽略NULL值,只拼接指定class的results值 - 不需要嵌套子查询或额外的
CONCAT_WS,GROUP_CONCAT自带的SEPARATOR参数可以直接指定<br>作为拼接分隔符 - 外层保留原有的
GROUP BY id, day分组逻辑、按星期排序逻辑即可,和需求的分组规则完全匹配
内容的提问来源于stack exchange,提问作者aimee
相关产品推荐
相关产品推荐

