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的主要内容,如果未能解决你的问题,请参考以下文章
从一个非常大的 MySQL 转储文件中以 csv 格式获取数据
关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题