如何从表中检索不同的行

时间:2015-08-27 16:47:37

标签: php mysql sql mysqli

我的数据库中有一个名为message的表,用户可以在其中发送和检索消息。

这是布局:

msg_id sender_id receiver_id 日期 txt

我希望能够检索发送给特定用户的消息,只有每个用户的最后一条消息,例如用户ID 1可能有多个消息,但我只想显示最后一条消息。

2 个答案:

答案 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 BYLIMIT作为查询

示例:

SELECT * FROM message WHERE receiver_id=1 ORDER BY date DESC LIMIT 1