MYSQL函数和GROUP_CONCAT的问题

时间:2011-03-22 18:13:21

标签: mysql

我在下面创建了数据库功能。然而,当我运行它时,结果没有正确排序,也没有应用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 ;

1 个答案:

答案 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