簡體   English   中英

如何從表格中檢索不同的行

[英]How do i retrieve distinct rows from a table

我的數據庫中有一個名為message的表,用戶可以在其中發送和檢索消息。

這是布局:

msg_id sender_id receiver_id 日期 txt

我希望能夠檢索發送給特定用戶的消息,每個用戶只有最后一條消息,例如,用戶ID 1可能有多個消息,但是我只想顯示最后一條消息。

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

要么

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 ... any)的變體。 但是請記住,如果您有數百萬條記錄,它可能會變得非常緩慢。

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
  ;

您需要對查詢使用ORDER BYLIMIT

例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM