Mysql
mysql best n per group:每次對話的最新消息內容和時間
我有兩張表,一張用於主題,一張用於消息。就關係而言,消息是在一個主題內發布的,因此每個主題都有很多消息。
我正在嘗試進行以下查詢: - 列出所有主題 - 獲取每個主題的消息計數 - 獲取每個主題(時間和內容)發布的最新消息
我基本上試圖做一個類似於以下的查詢:
SELECT topic.*, COUNT(msg.id), MAX(msg.time), msg.content FROM topics LEFT JOIN ( SELECT msg.id, msg.time, msg.content, msg.topic_id FROM messages AS msg ORDER BY time DESC ) AS msg ON msg.topic_id=topic.id GROUP BY topic.id
但是,這會導致錯誤
SELECT 列表的表達式 #…(已關閉)不在 GROUP BY 子句中,並且包含非聚合列“msg.time”,該列在功能上不依賴於 GROUP BY 子句中的列;這與 sql_mode=only_full_group_by 不兼容
我知道我可以切換
only_full_group_by
設置,但我的理解是,我無法保證它msg.content
會按預期返回最新消息。我在
greatest n per group
網上找到了很多問題,但大多數似乎只處理一個表,在查詢和子查詢中查詢的是同一個表。有什麼可靠的方法可以用 MySQL 實現這一點嗎?
SELECT t.*, m4.count, m4.time, m4.content FROM topics t LEFT JOIN ( SELECT m1.topic_id, m3.count, m3.time, m1.content FROM messages m1 INNER JOIN ( SELECT m2.topic_id, COUNT(m2.topic_id) count, MAX(m2.time) time FROM messages m2 GROUP BY m2.topic_id ) m3 ON m1.topic_id = m3.topic_id AND m1.time = m3.time ) m4 ON t.id = m4.topic_id
我認為這
messages (topic_id, time)
是獨一無二的。