簡體   English   中英

Group_concat具有復雜查詢或子查詢輸出?

[英]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

內部查詢按用戶,日期DESCASC排序,然后分配一個行號,因此第1行和第2行將是最新記錄或最早記錄。 然后將它們聯合在一起,然后將外部SELECT group_concat和按用戶分組。

sqlFiddle

或者,如果您知道每個用戶將始終有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

sqlFiddle

您的日期列也應該是date類型或datetime類型。 現在看起來像varchar類型。 現在可以使用,因為它們都是1月(1),當年份更改時,或者當您獲得Oct,Nov,Dec(10,11,12)作為月份時order by date如果date不是正確的date ,則按order by dateorder by date將中斷datetime類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM