mysql - 有没有更好的方法将 MySQL GROUP_CONCAT 输出拆分为多行?例如说每六 (6) 条记录后

标签 mysql mariadb rows group-concat mariadb-10.1

我已经成功地实现了下面这个场景:

SELECT GROUP_CONCAT(coursecode) 
    FROM (
    SELECT coursecode FROM Table18
    WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) <= 39

    UNION  

    SELECT coursecode FROM Table17
    WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) <= 39
) s

WHERE coursecode 
NOT IN (
    SELECT coursecode 
    FROM Table18
    WHERE regno = 'StudentXYZ' 
    AND (ca_score + exam_score) >= 40

    UNION

    SELECT coursecode 
    FROM Table17
    WHERE regno = 'StudentXYZ' 
    AND (ca_score + exam_score) >= 40
    )

这很好用! 以下是示例结果:

+----------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(coursecode)                                                                                 |
+----------------------------------------------------------------------------------------------------------+
| EDU222,EDU497,POS302,POS405,POS420,EDU224,EDU311,EDU312,EDU313,GST304,GST305,POS304,POS305,POS308,POS309 |
+----------------------------------------------------------------------------------------------------------+

但这就是我想要实现的:

+-------------------------------------------------+
| GROUP_CONCAT(coursecode)                        |
+-------------------------------------------------+
| EDU222, EDU497, POS302, POS405, POS420, EDU224, |
| EDU311, EDU312, EDU313, GST304, GST305, POS304, |
| POS305, POS308, POS309                          |
+-------------------------------------------------+

有什么建议吗?或者更好的方法来解决这个挑战?

最佳答案

您可以执行如下操作(支持 MySQL 5.7/MariaDB < 10.2):

SELECT GROUP_CONCAT(coursecode)
FROM (
    SELECT coursecode, @gn:=@gn+1, CEIL(@gn / 6) gn
    FROM (
        SELECT coursecode FROM Table18
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) <= 39

        UNION  

        SELECT coursecode FROM Table17
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) <= 39
    ) s, (SELECT @gn:=0)gn
    WHERE coursecode NOT IN (
        SELECT coursecode 
        FROM Table18
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) >= 40

        UNION

        SELECT coursecode 
        FROM Table17
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) >= 40
    )
) group_view GROUP BY group_view.gn

demo on dbfiddle.uk

从 MySQL 8.0/MariaDB 10.2 开始,您可以使用相同的逻辑,但使用 ROW_NUMBER而不是变量。所以你的查询可以是这样的:

SELECT GROUP_CONCAT(coursecode)
FROM (
    SELECT coursecode, CEIL(ROW_NUMBER() OVER (ORDER BY code ASC) / 6) gn
    FROM (
        SELECT coursecode FROM Table18
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) <= 39

        UNION  

        SELECT coursecode FROM Table17
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) <= 39
    ) s
    WHERE coursecode NOT IN (
        SELECT coursecode 
        FROM Table18
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) >= 40

        UNION

        SELECT coursecode 
        FROM Table17
        WHERE regno = 'StudentXYZ' AND (ca_score + exam_score) >= 40
    )
) group_view GROUP BY group_view.gn

demo on dbfiddle.uk

关于mysql - 有没有更好的方法将 MySQL GROUP_CONCAT 输出拆分为多行?例如说每六 (6) 条记录后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57482555/

相关文章:

MYSQL如何选择单价之一

mysql - 如何在字符串中使用方括号执行 LIKE 查询?

ubuntu - wsl 2 ubuntu mariadb .my.cnf.42' 被忽略

mysql - Maria 数据库中的行锁定

mysql - procedure/outfile/prepared 语句的权限

php - 如何将多行值显示为单行

excel - 在 Excel 中将多行转换为单堆叠列

Mysql - 如何消除具有多列重复(不重复)的行

php - 编码/转义 JSON 控制字符

mysql - CakePHP 3 : How to count and retrieve data for different periods in one query?