我对数据库不太熟悉(只为前端开发人员做了一定数量的工作)
无论如何,我遇到了问题,我试图在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
答案 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}}