簡體   English   中英

分組具有多個最大值的消息?

[英]Grouping of messages with more than one max value?

我在論壇中有一個私人消息系統。 我想重建這個消息傳遞系統,使其不再基於消息,而是基於對話。 它應該像 Whatsapp 或任何其他信使,在那里你沒有消息,只有聯系人。

我已經編寫了以下 SQL 查詢。

    SELECT t.*, 
       p.root_level, 
       p.message_time, 
       p.icon_id, 
       p.to_address, 
       p.message_attachment, 
       p.bcc_address, 
       u.username, 
       u.username_clean, 
       u.user_colour, 
       p.message_reported, 
       Max(p.msg_id) AS maxid, 
       p.message_subject 
FROM   phpbb3_privmsgs_to t 
       LEFT JOIN phpbb3_privmsgs p 
              ON ( p.msg_id = t.msg_id ) 
       LEFT JOIN phpbb3_users u 
              ON ( u.user_id = p.author_id ) 
WHERE  t.user_id = 1234 
       AND t.user_id != p.author_id 
       AND t.pm_deleted = 0 
GROUP  BY t.author_id, 
          t.user_id 
ORDER  BY maxid DESC

此查詢運行良好。 分組工作和排序,但每個組中的 message_time 不是最新的。 最早對話的時間/日期被采用。

如何在每個組中獲取最新的 message_time ?

這是非常常見的“獲取具有最大值的行的詳細信息”要求的示例。 在您的情況下,您希望為每個作者獲取privmsgs表中的最新消息。 然后你想將它加入到你的users表中。

首先,使用子查詢查找每個作者(用戶)的最近消息時間。 像這樣:

                SELECT author_id,  MAX(message_time) message_time
                  FROM privmsgs
                 GROUP BY author_id

手動測試一下。 請注意,它為每個author_id值提供了一行,其中一列顯示了最新的message_time 您需要使用message_time來選擇需要從中獲取詳細信息的行。

讓我們這樣做。 接下來,將該子查詢合並到您的查詢中,就像這樣。

SELECT u.user_id, u.username, 
       p.*, whatever, but no MAX() functions
  FROM users u
  JOIN privmsgs p ON u.user_id = p.author_id
  JOIN (
                SELECT author_id,  MAX(message_time) message_time
                  FROM privmsgs
                 GROUP BY author_id
       ) maxmsgt    ON p.author_id = maxmsgt.author_id
             AND p.message_time = maxmsgt.message_time

 WHERE (whatever filter)
 ORDER BY (whatever order)

加入該子查詢可讓您提供 ON 條件以僅獲取具有最新時間的消息。 您的 GROUP BY 操作在子查詢中,而不是在主查詢中。 它看起來很復雜,但它是一種非常常見的查詢模式。

暫無
暫無

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

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