[英]Group_concat with complex queries or subquery output?
我有一個大的MySQL表follow
,看起來像下表中勾畫出來。 它具有數百萬行和數千個users
。
我正在嘗試使用group_concat編寫查詢,以便對於每個用戶,我將拉出他們的第一個/最早的2個“關注”記錄(基於日期)和最近/最近的2個“關注”記錄(基於日期)因此結果看起來像下面的“理想結果表”。
有任何想法嗎? 非常感謝您的提前幫助。
follow
-------
User | Following | Date
.......................................
ABCD | 1111 | 1/1/2013
ABCD | 2222 | 1/2/2013
ABCD | 3333 | 1/3/2013
ABCD | 4444 | 1/4/2013
ABCD | 5555 | 1/5/2013
ABCD | 6666 | 1/6/2013
DEFG | 1111 | 1/1/2013
DEFG | 7777 | 1/2/2013
DEFG | 3333 | 1/3/2013
DEFG | 4444 | 1/4/2013
DEFG | 5555 | 1/5/2013
HIJK | 0000 | 1/1/2013
HIJK | 2222 | 1/2/2013
HIJK | 3333 | 1/3/2013
HIJK | 4444 | 1/4/2013
HIJK | 8888 | 1/5/2013
HIJK | 9999 | 1/6/2013
Ideal result
------------
User | Following
..............................................
ABCD | 1111, 2222, 5555, 6666
DEFG | 1111, 7777, 4444, 5555
HIJK | 0000, 2222, 8888, 9999
您可以使用以下查詢來獲得答案
SELECT user, GROUP_CONCAT( Following ) AS following FROM `follow` GROUP BY user LIMIT 0 , 30
正如Barmar建議的那樣。 這是一個可能的版本。
SELECT user,GROUP_CONCAT(following ORDER BY date) as following
FROM
(SELECT user,following,date FROM
(SELECT user,following,date,
IF (@prevUser IS NULL OR @prevUser != user,@row:=1,@row:=@row+1) as row,
@prevUser := user
FROM follow
ORDER BY user,date ASC)as EarlyRecords
WHERE row IN (1,2)
UNION
SELECT user,following,date FROM
(SELECT user,following,date,
IF (@prevUser2 IS NULL OR @prevUser2 != user,@row:=1,@row:=@row+1) as row,
@prevUser2 := user
FROM follow
ORDER BY user,date DESC)as LateRecords
WHERE row IN (1,2)
)as AllRecords
GROUP BY user
內部查詢按用戶,日期DESC
和ASC
排序,然后分配一個行號,因此第1行和第2行將是最新記錄或最早記錄。 然后將它們聯合在一起,然后將外部SELECT group_concat和按用戶分組。
或者,如果您知道每個用戶將始終有4個以下或更多用戶,則可以在下面使用此簡短查詢
SELECT user,CONCAT(
SUBSTRING_INDEX(GROUP_CONCAT(following ORDER BY date asc),',',2),
',',
SUBSTRING_INDEX(GROUP_CONCAT(following ORDER BY date asc),',',-2)
) as following
FROM follow
GROUP BY user
您的日期列也應該是date
類型或datetime
類型。 現在看起來像varchar
類型。 現在可以使用,因為它們都是1月(1),當年份更改時,或者當您獲得Oct,Nov,Dec(10,11,12)作為月份時order by date
如果date
不是正確的date
,則按order by date
的order by date
將中斷datetime
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.