如何破解MySQL GROUP_CONCAT以获取有限数量的行?

时间:2009-10-05 21:30:22

标签: mysql limit group-concat

我不知何故需要这个功能,但MySQL目前不支持它。

我正在使用GROUP_CONCAT(CONCAT(...))生成类似xml的内容。

但是当大小超过限制时,xml就会被破坏!

所以我必须以某种方式让它只检索5行!

6 个答案:

答案 0 :(得分:15)

我使用SUBSTRING_INDEX解决了这个问题。

例如:

SELECT SUBSTRING_INDEX(GROUP_CONCAT(Field1 SEPARATOR ','), ',', [# of elements to return])
FROM Table1;

答案 1 :(得分:4)

Charles回答的一个例子:

基本:

SELECT GROUP_CONCAT( field ) FROM ( SELECT field FROM table LIMIT 200 )

扩展:

如果结果被缓冲区截断,则CAST非常有用:

SELECT CAST( GROUP_CONCAT( field ) AS CHAR(2048) ) FROM ( SELECT field FROM table LIMIT 200 )

答案 2 :(得分:2)

使用临时表/子查询来限制结果?如果没有看到您的查询,就很难为该路线提供可靠的建议。

但是,您可能会发现group_concat_max_len设置更有用。它以字符串长度控制GROUP_CONCAT操作的最大长度。当你无法限制结果时,提高它以防止损坏GROUP_CONCAT

答案 3 :(得分:2)

对于你的问题不是一个真正的答案,而是为那些也希望在GROUP_CONCAT()中使用LIMIT子句的人提供参考:

很久以前就向MySql开发人员提交了feature-request。尚未实施: - (

答案 4 :(得分:0)

对于那些你不能使用临时表的情况,我所知道的最好方法是选择一个模糊的分隔符,然后从所述字符的第一个实例开始截断。此示例使用NUL字符。

select substring_index(group_concat(field separator '\0'), '\0', 5) from table;

field是字段的名称,5是结果的数量。

缺点是如果你的第一行包含该字符,那将是部分结果。

解决方法是将'\0'替换为较长的随机字符串。

很高兴知道可以使用field替换concat以包含更多信息。

请记住group_concat_max_len默认为1024个字符,因此如果您想要更多,请考虑全局或在应用程序中更改。

答案 5 :(得分:0)

您可以使用用户变量模拟分区的row_number,然后限制行并应用group_concat:

考虑下表:

create table your_table (
    id int primary key autoincrement,
    category int,
    value int
);

和数据:

insert into your_table (category, value) 
values
(1,  1), (1,  2), (1,  3), (1,  4), (1,  5),
(2,  6), (2,  7), (2,  8), (2,  9), (2, 10),
(3, 11), (3, 12), (3, 13), (3, 14), (3, 15);

我们想要的是每个类别连接的前三名(按最新ID的顺序排列):

select category, 
    group_concat(value order by id desc) as value_con
from (
    select t.*,
        @rn := if(@category = category, @rn + 1, if(@category := category,1, 1)) as seqnum
    from your_table t
    cross join (select @category := null, @rn := 0) x
    order by t.category, t.id desc
    ) t
where seqnum <= 3
group by category;

输出:

category    value_con
1           5,4,3
2           10,9,8
3           15,14,13

以下是demo