我有一个很大的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
答案 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
内部查询按用户排序,日期DESC
和ASC
然后分配行号,因此第1行和第2行将是最新记录或最早记录。然后他们一起UNION-ed,然后是外部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),当年份发生变化,或者当你得到10月,11月,12月(10,11,12)时,如果它们不合适,你的order by date
将会中断date
或datetime
类型。