我莫名其妙地需要这个功能,但MySQL不会在这个时候支持它。
我使用的GROUP_CONCAT(CONCAT(...))
来生成一个XML一样的东西。
但是,当大小超过限制时,XML只是碎了!
所以,我必须以某种方式使其只检索5行!
我莫名其妙地需要这个功能,但MySQL不会在这个时候支持它。
我使用的GROUP_CONCAT(CONCAT(...))
来生成一个XML一样的东西。
但是,当大小超过限制时,XML只是碎了!
所以,我必须以某种方式使其只检索5行!
我已经解决这个使用工作SUBSTRING_INDEX
。
例如:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(Field1 SEPARATOR ','), ',', [# of elements to return])
FROM Table1;
查尔斯回答一个例子:
基本:
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 )
不是一个真正的回答你的问题,但对于谁也想使用GROUP_CONCAT()LIMIT子句其他人参考:
一个功能请求被提起不久前MySQL开发。 尚未实现 :-(
使用临时表/子查询限制的结果吗? 没有看到您的查询,这将是很难给出可靠的建议为这条路线。
但是,你可能会发现group_concat_max_len
设置更加有用。 它控制的最大长度GROUP_CONCAT
操作中,字符串长度。 将其抬起,以防止破GROUP_CONCAT
年代,当你不能限制的结果。
对于这些情况下,您不能使用临时表,我知道最好的办法是选择一个不起眼的分离,然后截断开始的第一个实例说字符。 本示例使用NULL字符。
select substring_index(group_concat(field separator '\0'), '\0', 5) from table;
其中field
是字段的名称, 5
是结果的数量。
其缺点是,如果你的第一行包含该字符,这将是一个部分结果。
一种解决方法是更换'\0'
具有较长的随机字符串。
这是很好的了解, field
能及时更换,包括使用更多的信息concat
。
请记住group_concat_max_len
默认为1024个字符,所以你应该考虑改变这种全局或应用程序中,如果你想比这更多。
您可以使用用户变量模拟分区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);
而我们想为级联每个类别的前3名(在最新的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
这里是一个演示了这一点。