[英]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.