GROUP_CONCAT()按文本字段分组时的行数

时间:2012-10-12 16:01:23

标签: mysql select group-by group-concat

DROP TABLE IF EXISTS `table`;
CREATE TABLE `table` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `text` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `table` VALUES ('1', 'Unpacked reserved sir offering bed judgment may and quitting speaking. Is do be improved raptures offering required in replying raillery. Stairs ladies friend by in mutual an no. Mr hence chief he cause. Whole no doors on hoped. Mile tell if help they ye full name. \r\n\r\nLadyship it daughter securing procured or am moreover mr. Put sir she exercise vicinity cheerful wondered. Continual say suspicion provision you neglected sir curiosity unwilling. Simplicity end themselves increasing led day sympathize yet. General windows effects not are drawing man garrets. Common indeed garden you his ladies out yet. Preference imprudence contrasted to remarkably in on. Taken now you him trees tears any. Her object giving end sister except oppose. \r\n\r\nWas justice improve age article between. No projection as up preference reasonably delightful celebrated. Preserved and abilities assurance tolerably breakfast use saw. And painted letters forming far village elderly compact. Her rest west each spot his and you knew. Estate gay wooded depart six far her. Of we be have it lose gate bred. Do separate removing or expenses in. Had covered but evident chapter matters anxious.');
INSERT INTO `table` VALUES ('2', 'Unpacked reserved sir offering bed judgment may and quitting speaking. Is do be improved raptures offering required in replying raillery. Stairs ladies friend by in mutual an no. Mr hence chief he cause. Whole no doors on hoped. Mile tell if help they ye full name. \r\n\r\nLadyship it daughter securing procured or am moreover mr. Put sir she exercise vicinity cheerful wondered. Continual say suspicion provision you neglected sir curiosity unwilling. Simplicity end themselves increasing led day sympathize yet. General windows effects not are drawing man garrets. Common indeed garden you his ladies out yet. Preference imprudence contrasted to remarkably in on. Taken now you him trees tears any. Her object giving end sister except oppose. \r\n\r\nWas justice improve age article between. No projection as up preference reasonably delightful celebrated. Preserved and abilities assurance tolerably breakfast use saw. And painted letters forming far village elderly compact. Her rest west each spot his and you knew. Estate gay wooded depart six far her. Of we be have it lose gate bred. Do separate removing or expenses in. Had covered but evident chapter matters anxious');

在不使用GROUP BY的情况下运行GROUP_CONCAT()查询时,结果集与预期一致(显示两行,每个变体text一行):

SELECT
    `text`
FROM
    `table`
GROUP BY
    `text`;

+-----------------------------------+
| text                              |
+-----------------------------------+
| Unpacked reserved sir offering... |
| Unpacked reserved sir offering... |
+-----------------------------------+
2 rows in set (0.02 sec)

但是,当使用GROUP_CONCAT()运行相同的查询时,结果集不符合预期(显示一行包含两个id字段的串联字符串):

SELECT
    GROUP_CONCAT(`id` SEPARATOR ', ') AS ids
FROM
    `table`
GROUP BY
    `text`;

+------+
| ids  |
+------+
| 1, 2 |
+------+
1 row in set (0.00 sec)

我的问题:

为什么使用GROUP_CONCAT()会影响返回的行数?

我最初的假设是GROUP_CONCAT_MAX_LEN与它有关(我的设置为1024)但肯定只影响GROUP_CONCAT(),而不是GROUP BY(同样,你可能会注意到) ,我在GROUP_CONCAT()字段使用id,而不是text字段,结果甚至没有超过GROUP_CONCAT_MAX_LEN

2 个答案:

答案 0 :(得分:5)

您必须根据需要将 max_sort_length 更改为更高的会话数或全局数。默认情况下,其值为 1024 字节,并且您的字符串包含 1170 字节数据。通过增加大小,它将为 GROUP_CONCAT 提供两行。

点击此链接max_sort_length

SELECT `text` FROM `table` GROUP BY `text`;

SET SESSION max_sort_length = 2000;
SELECT GROUP_CONCAT(`id` SEPARATOR ', ') AS ids FROM `table` GROUP BY `text`;

检查SQL FIDDLE DEMO

编辑 BLOB TEXT 值无法在 GROUP BY 中可靠地使用ORDER BY DISTINCT 。在这些情况下比较BLOB值时,仅使用第一个 max_sort_length 字节。默认值 max_sort_length 为1024,可以在服务器启动时或运行时更改。

答案 1 :(得分:1)

您似乎遇到了MySQL默认的GROUP_CONCAT_MAX_LEN。你的字符串长度为1178,肯定超过1024的默认值。这意味着,如果值的差异超过1024,MySQL将忽略它,因为前1024个字符完全相同。这是GROUP_CONCAT行为的限制,而不是GROUP。

你可以在MySQL的my.cnf文件中做大。

请点击此处了解更多详情:

http://www.coderanch.com/t/422632/JDBC/databases/increase-group-concat-max-len