具有复杂查询或子查询输出的Group_concat?

时间:2014-01-16 05:35:05

标签: mysql sql

我有一个很大的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

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询来回答

SELECT user, GROUP_CONCAT( Following ) AS following FROM `follow` GROUP BY user LIMIT 0 , 30

答案 1 :(得分:0)

巴尔玛建议道。这是一个可能的版本。

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行将是最新记录或最早记录。然后他们一起UNION-ed,然后是外部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),当年份发生变化,或者当你得到10月,11月,12月(10,11,12)时,如果它们不合适,你的order by date将会中断datedatetime类型。