显示每个用户的最后3条消息

时间:2014-05-13 01:51:52

标签: mysql sql database join

我对数据库不太熟悉(只为前端开发人员做了一定数量的工作)

无论如何,我遇到了问题,我试图在MySQL中解决...让我说我有两个相关的表格表:

users(id INT,user_name VARCHAR(20))

id  name
-----------------
1   Mike
2   Maria
3   John

消息(id INT,user_id INT,消息TEXT,DATE创建)

id    user_id    message        created
--------------------------------------------------
1     1          message 1      2014-05-01 12:12
2     3          message 2      2014-05-01 15:27
3     2          message 3      2014-05-02 14:57
4     2          message 4      2014-05-02 16:14
5     3          message 5      2014-05-03 16:15
6     1          message 6      2014-05-07 10:39
7     1          message 7      2014-05-01 12:27
8     1          message 8      2014-05-02 20:16
9     2          message 9      2014-05-03 05:01
10    1          message 10     2014-05-04 11:05
11    2          message 11     2014-05-06 20:41
12    1          message 12     2014-05-07 14:32
13    3          message 13     2014-05-08 12:54
14    3          message 14     2014-05-09 23:20
15    1          message 15     2014-05-11 00:45

我需要按照输出结果显示每个用户的最后3条消息:

id   name        m1             m2            m3
------------------------------------------------------------
1    Mike        message 15     message 12    message 6
2    Maria       message 11     message 9     message 4
3    John        message 14     message 13    message 5

直觉上我明白我必须使用内连接,但我的大脑在第二或第三线后开始融化。

有很多例子,其中输出仅用于最后一条消息(m1),但他们使用sort来查找最后一条消息。

任何帮助都将不胜感激。

更新

我最初尝试使用左连接,但最终得到这个。我的意思是它有效(但非常糟糕)。它将所有消息连接成一个字符串行(1024个字符)。

 SELECT u.name, GROUP_CONCAT(message ORDER BY message.created DESC) messages
 FROM messages m, users u
 WHERE u.id = m.user_id

1 个答案:

答案 0 :(得分:1)

如果您使用的是其他RDBMS,则不会那么困难。但基本上您需要为每个用户获取一个行号,然后使用max case使用select u.id, u.user_name, max(case when rn=1 then message end) m1, max(case when rn=2 then message end) m2, max(case when rn=3 then message end) m3 from users u join ( select id, user_id, message, @rn:=IF(user_id=@prevUserId,@rn+1,1) rn, @prevUserId:=user_id, created from message join (select @prevUserId:= 0, @rn:= 0) t order by user_id, created desc ) m on u.id = m.user_id group by u.id, u.user_name

这样的事情应该有效:

{{1}}