MySQL 中 CSV 格式的 GROUP_CONCAT

Posted

技术标签:

【中文标题】MySQL 中 CSV 格式的 GROUP_CONCAT【英文标题】:CSV formatted GROUP_CONCAT in MySQL 【发布时间】:2012-09-27 22:38:58 【问题描述】:

假设我有一个 Table A,我想将其转换为 Table B

表 B 中的值应始终是具有 相同数量的字段 的 CSV 格式文本。

首先,我需要知道给定类别处理的 最大数量 值是多少(在本例中,类别 1、2 和 4 中的 3 个值) ;

其次,当类别具有“缺失”值时,我还需要使用该变量将空字段(“,”)“添加”到 GROUP_CONCAT 的末尾。

我需要这个在每个单元格中都有一个“一致”的 CSV。我用来处理这些数据的应用程序不能很好地解释具有不同列号的 CSV...

表 A

+----+----------+-------+
| id | category | value |
+----+----------+-------+
| 1  |    1     |   a   |
| 2  |    1     |   b   |
| 3  |    1     |   c   |
| 4  |    2     |   d   |
| 5  |    2     |   e   |
| 6  |    2     |   f   |
| 7  |    3     |   g   |
| 8  |    3     |   h   |
| 9  |    4     |   i   |
| 10 |    4     |   j   |
| 11 |    4     |   k   |
| 12 |    5     |   l   |
+----+----------+-------+

表 B

+--------------+---------------------+
| id(category) | value(group_concat) |
+--------------+---------------------+
|      1       |        a,b,c        |
|      2       |        d,e,f        |
|      3       |        g,h,         |
|      4       |        i,j,k        |
|      5       |        l,,          |
+--------------+---------------------+

已编辑(SQLFiddle):

http://sqlfiddle.com/#!2/825f8

【问题讨论】:

感谢 sqlfiddle。它确实有帮助! 【参考方案1】:

首先,获取给定类别处理的最大数量的值

select count(category) from tableA group by category order by count(category) desc limit 1;

其次,当类别有“缺失”值时,将空字段(“,”)添加到 GROUP_CONCAT 的末尾。

我创建了一个名为 unify_length 的函数来帮助做到这一点。

这是函数:

delimiter $$

CREATE FUNCTION `unify_length`(csv_list CHAR(255), length INT) RETURNS char(255)
    DETERMINISTIC
BEGIN        
        WHILE ((SELECT LENGTH(csv_list) - LENGTH(REPLACE(csv_list, ',', ''))) < length-1) DO /* count the number of occurrances in a string*/
            SET csv_list = CONCAT(csv_list, ',');        
        END WHILE;

        RETURN csv_list;
END$$

这是函数调用:

select category, unify_length(GROUP_CONCAT(value), length) from tablea group by category;

length 是第一个查询返回的内容。

【讨论】:

以上是关于MySQL 中 CSV 格式的 GROUP_CONCAT的主要内容,如果未能解决你的问题,请参考以下文章

如何将csv导入mysql和mysql导出csv

从一个非常大的 MySQL 转储文件中以 csv 格式获取数据

关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题

如何以CSV格式输出MySQL查询结果?

如何以 csv 格式输出 MySQL 查询结果(到屏幕,而不是文件)?

如何以 CSV 格式输出 MySQL 查询结果?