我的数据库中有一个名为message
的表,用户可以在其中发送和检索消息。
这是布局:
msg_id sender_id receiver_id 日期 txt
我希望能够检索发送给特定用户的消息,只有每个用户的最后一条消息,例如用户ID 1
可能有多个消息,但我只想显示最后一条消息。
答案 0 :(得分:2)
http://sqlfiddle.com/#!9/81b57/3
SELECT m.*
FROM messages m
LEFT JOIN messages m1
ON m.sender_id = m1.sender_id
AND m.date<m1.date
WHERE m1.msg_id IS NULL
ORDER BY sender_id
OR
SELECT m.*
FROM messages m
LEFT JOIN messages m1
ON m.receiver_id = m1.receiver_id
AND m.date<m1.date
WHERE m1.msg_id IS NULL
ORDER BY receiver_id;
更新以下是每个用户的灵活限制(2-3-4 ...任意)记录的变体。但请记住,如果你有数百万条记录,它可能会变得非常慢。
http://sqlfiddle.com/#!9/81b57/13
SELECT m.*
FROM
(SELECT *,
IF(@user=receiver_id,@user_index:=@user_index+1,@user_index:=1) idx,
@user:=receiver_id
FROM messages
ORDER BY receiver_id, `date` DESC
) m
WHERE m.idx<=2
**更新2 *另一种方法。我想它可能会更快:
http://sqlfiddle.com/#!9/6bfbd/1
SELECT m.*
FROM messages m
INNER JOIN (
SELECT receiver_id,
GROUP_CONCAT(msg_id ORDER BY `date` DESC) ord
FROM messages
GROUP BY receiver_id
) o
ON o.receiver_id = m.receiver_id
and FIND_IN_SET(m.msg_id, o.ord) BETWEEN 1 AND 2
ORDER BY m.receiver_id, m.date DESC
;
答案 1 :(得分:1)
您需要使用ORDER BY
和LIMIT
作为查询
示例:
SELECT * FROM message WHERE receiver_id=1 ORDER BY date DESC LIMIT 1