簡體   English   中英

如何通過使用分組依據語句從表中選擇最新記錄

[英]how to select latest record from table by using Group by statements

我根據發件人ID從表和組中獲取聊天消息


消息表

msg_id     msg(messages)  sender(user id)  receiver (user id)  time (timestamp)
------------------------------------------------------------------------------
 1              hello bro             1              2                 12am
 2              hello                 2              1                 12am
 3              i disscuss something  1              2                 12:01am
 4              are you free          1              2                 12:03am

-----------------------------------------------------
**User Table**
-----------------------------------------------------
 u_id       user_name    
  1           khalid
  2           brain
  3           abdullah

然后當我進行此查詢

SELECT sender.user_name sender, receiver.user_name receiver,
       messages.time msgtime, messages.msg msg,sender.u_id u_id,
       sender.user_name user_name FROM messages LEFT JOIN user 
       AS sender ON messages.sender = sender.u_id LEFT JOIN user
       AS receiver ON messages.receiver = receiver.u_id where 
       sender.u_id<>1 group by messages.sender ORDER BY 
       messages.msg_id desc

但是當我使用發件人分組時,它不會按聲明顯示最新消息,而是顯示舊記錄

我想要的是

我想查詢顯示每個發件人的最新最新消息

通過簡單的-你可以做到這一點沒有在所有分組left joining消息表本身,與謂語是相同的發送者,后來時間戳。 如果沒有更晚的時間戳,則第二個表中的結果將為空值,這意味着您已標識了最新消息。

select s.user_name as `from`, r.user_name as `to`, m1.msg, m1.time 
  from messages m1
    left join messages m2
      on m1.time < m2.time and m1.sender = m2.sender
    inner join users s
      on m1.sender = s.u_id
    inner join users r
      on m1.receiver = r.u_id
  where m2.sender is null;

如果您絕對要使用group by ,則可以通過首先為每個發件人找到max(time)並將結果返回到message和users表中來進行操作,如下所示:

select s.user_name as `from`, r.user_name as `to`, m.msg, m.time
  from messages m
    inner join users s
      on m.sender = s.u_id
    inner join users r
      on m.receiver = r.u_id
    inner join (
      select sender, max(`time`) as ts
        from messages
        group by sender
    ) q on m.sender = q.sender and m.time = q.ts

這兩個查詢將為您提供相同的結果

您按日期順序選擇它。 ORDER BY messages.timestamp desc

SELECT sender.user_name sender, receiver.user_name receiver,MAX(messages.time) msgtime, messages.msg msg,sender.u_id u_id,sender.user_name user_name 
FROM messages 
INNER JOIN user AS sender 
ON messages.sender = sender.u_id 
INNER JOIN user AS receiver 
ON messages.receiver = receiver.u_id 
where sender.u_id<>1 
group by messages.sender 
ORDER BY messages.msg_id desc

首先從此查詢中選擇最近的味精

SELECT sender, receiver, MAX(time) AS Most_Recent 
                                    FROM Messages WHERE receiver = receiverid(userid that receive this msg) GROUP BY sender 

知道此查詢根據最近的發件人味精給組

暫無
暫無

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

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