我有一个下面列出的功能。当我在LIMIT设置为0,60时调用它,如下所示,它工作正常。但是,每当我将LIMIT增加到70或更高,甚至删除LIMIT时,我在调用函数时出现错误:“行30153被GROUP_CONCAT()”切断。
我尝试将varchar值增加到10 000,但这没有用。 据我所知,从错误来看,它们似乎没有足够的空间作为内容的变量。但正如我所提到的,我已经尝试过增加尺寸,但它没有帮助。有任何想法吗??感谢
DELIMITER $$
DROP FUNCTION IF EXISTS `fnAlbumGetPhotoList` $$
CREATE DEFINER=`root`@`%` FUNCTION `fnAlbumGetPhotoList`(_albumId int) RETURNS varchar(2048) CHARSET utf8
BEGIN
DECLARE _outPhotoList VARCHAR(2048);
SET _outPhotoList = (
SELECT (CAST(GROUP_CONCAT(CONCAT(photoId, '|', photoFileName) separator '~') AS CHAR(10000) CHARACTER SET utf8)) AS recentPhotoList
FROM
(
SELECT photoId, photoFileName
FROM photo
WHERE photoAlbumId = _albumId
AND photoIsDisabled = 0
AND photoIsActive = 1
ORDER BY photoId DESC
LIMIT 0,60
) as subQuery
);
RETURN _outPhotoList;
END $$
DELIMITER ;
答案 0 :(得分:77)
您可以将group_concat_max_len变量设置为更大的值。或者使用GROUP_CONCAT(DISTINCT ...)
来缩短结果。
答案 1 :(得分:10)
1)增加结果查询中字符数的限制
SET global group_concat_max_len=15000;
OR
SET session group_concat_max_len=15000;
如果您希望将设置设置为新的全局默认值(粘性),请使用前者
如果您只想在当前会话期间使用此设置,请使用后者
(另请注意,有些人在使用global
选项时遇到了问题。在这种情况下,请尝试将其关闭,例如SET group_concat_max_len=15000;
。)
2)然后将DISTINCT
作为第一个参数添加到GROUP_CONCAT()
,以从结果查询中删除重复项。 GROUP_CONCAT(DISTINCT ..)
。
您的查询将更像这样:
SET session group_concat_max_len=15000;
...
... GROUP_CONCAT(DISTINCT CONCAT(photoId, ...)
...
)
Function Group Concat, from MySQL docs:
SET [GLOBAL | SESSION] group_concat_max_len = val;
在MySQL中,您可以获得表达式组合的连接值。要消除重复值,请使用DISTINCT子句。
...
结果被截断为group_concat_max_len系统变量给出的最大长度,该变量的默认值为1024.尽管返回值的有效最大长度受到值的约束,但该值可以设置得更高。 max_allowed_packet的。在运行时更改group_concat_max_len值的语法如下,其中val是无符号整数:
SET [GLOBAL | SESSION] group_concat_max_len = val;
返回值是非二进制或二进制字符串,具体取决于参数是非二进制还是二进制字符串。除非group_concat_max_len小于或等于512,否则结果类型为TEXT或BLOB,在这种情况下,结果类型为VARCHAR或VARBINARY。
大概没有指定一个可选的替代方案(GLOBAL
或SESSION
)将默认为第一个列出的替代方案(在这种情况下为GLOBAL
),尽管我无法在文档。
About syntax used in the MySQL docs:
当语法元素由许多替代项组成时,替代项由竖线(“|”)分隔。
如果选择中的一个成员可能,则替代方案会列在方括号内(“[”和“]”):
如果选择中的一个成员必须,则替代品会列在大括号内(“{”和“}”)