我在下面创建了数据库功能。然而,当我运行它时,结果没有正确排序,也没有应用LIMIT。例如,我返回的数据是:
31471|31471.jpg,31472|31472.jpg,31473|31473.jpg,31474|31474.jpg,31475|31475.jpg,31476|31476.jpg,31478|31478.jpg,31479|31479.jpg
正如你所看到的,有超过3个结果(LIMIT不起作用),当它们应该下降时,id是递增的,即使按日期排序(ORDER BY不工作)
与此功能唯一不同的是GROUP_CONCAT。是它导致问题和原因。如果没有,那么函数有什么问题呢?
由于
DELIMITER $$
DROP FUNCTION IF EXISTS `fnAlbumGetRecentPhotoList` $$
CREATE DEFINER=`root`@`%` FUNCTION `fnAlbumGetRecentPhotoList`(_albumId int) RETURNS varchar(1024) CHARSET utf8
BEGIN
-- ----------------------------------------------------------------------
-- Gets a list of 3 most recent photos for an album
-- ----------------------------------------------------------------------
DECLARE _outRecentPhotoList VARCHAR(1024);
SET _outRecentPhotoList = (
SELECT (CAST(GROUP_CONCAT(CONCAT(photoId, '|', photoFileName)) AS CHAR(10000) CHARACTER SET utf8)) AS recentPhotoList
FROM photo
WHERE photoAlbumId = _albumId
ORDER BY photoCSD DESC
LIMIT 0,3
);
RETURN _outRecentPhotoList;
END $$
DELIMITER ;
答案 0 :(得分:2)
GROUP_CONCAT()返回一行,因此对它应用LIMIT和ORDER将无法满足您的需求。
如果在子查询中嵌入LIMIT和ORDER BY,则可以获得所需的3行,然后将它们连接起来。
像这样:
SELECT (CAST(GROUP_CONCAT(CONCAT(photoId, '|', photoFileName)) AS CHAR(10000)
CHARACTER SET utf8)) AS recentPhotoList
FROM
(
SELECT photoId,photoFileName
FROM photo
WHERE photoAlbumId = _albumId
ORDER BY photoCSD DESC
LIMIT 0,3
) as sub_query