我不知何故需要这个功能,但 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
当您无法限制结果时,提高它以防止损坏s。
您可以使用用户变量模拟分区的 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
这是一个演示。
对于那些你不能使用临时表的情况,我知道的最好的方法是选择一个模糊的分隔符,然后从所述字符的第一个实例开始截断。此示例使用 NUL 字符。
select substring_index(group_concat(field separator '\0'), '\0', 5) from table;
wherefield
是字段的名称,5
是结果的数量。
缺点是如果您的第一行包含该字符,它将是部分结果。
一种解决方法是'\0'
用更长的随机字符串替换。
很高兴知道field
可以使用 替换以包含更多信息concat
。
请记住group_concat_max_len
默认值为 1024 个字符,因此如果您想要更多,您应该考虑在全局或在您的应用程序中更改它。