Mysql

mysql best n per group:每次對話的最新消息內容和時間

  • March 28, 2019

我有兩張表,一張用於主題,一張用於消息。就關係而言,消息是在一個主題內發布的,因此每個主題都有很多消息。

我正在嘗試進行以下查詢: - 列出所有主題 - 獲取每個主題的消息計數 - 獲取每個主題(時間和內容)發布的最新消息

我基本上試圖做一個類似於以下的查詢:

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)是獨一無二的。

引用自:https://dba.stackexchange.com/questions/233319