2011-03-22 102 views
0

我在下面創建了數據庫函數。但是,當我運行它時,結果排序不正確,也沒有應用LIMIT。例如,回到我的數據是:MYSQL函數和GROUP_CONCAT問題

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 not working)

與此函數唯一不同的是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 ; 

回答

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 
+0

啊哈感謝,這是它。 – Cheeky 2011-03-22 18:37:17

+0

將Group_CONCAT的列轉換爲varchar(255)數據類型是不可能的? – user4033385 2016-03-22 17:28:04

+0

@ user4033385:否,CAST()僅支持某些類型,包括CHAR,但不支持VARCHAR:http://dev.mysql.com/doc/refman/5.6/en/cast-functions.html#function_cast – 2016-03-22 18:46:09