将表连接到另一个表的MAX记录

时间:2014-05-21 07:32:38

标签: mysql sql optimization join aggregate-functions

让我们说我有一个MySQL数据库用于一个有两个表的在线论坛:

topic : id, ...
message : id, id_topic, created, ...

一个主题可能会有很多(或没有)消息,正如您所期望的那样。

我想获取每个主题记录的列表LEFT JOIN'以及最近创建的 消息记录(如果没有消息,则加入任何内容。我需要结果中两个记录的所有字段。

我一直在做的是使用子查询来创建所有最近创建的消息的表,然后将其加入主题表。然而,当主题表有几千行并且消息表有几十万时,它真的陷入困境。

解决这个问题的正确方法是什么,着眼于绩效?

2 个答案:

答案 0 :(得分:1)

试试这个:

 SELECT t.*, m.*
 FROM topic t
 LEFT JOIN
   (SELECT id_topic, MAX(created) AS created
    FROM message
    GROUP BY id_topic
   ) T2 ON t.id = T2.id_topic
 LEFT JOIN message m ON m.id_topic = T2.id_topic AND m.created = T2.created

<强>解释

首先,我们使用为每个id_topic创建了最大值的临时表来加入表主题。然后表消息与相同的临时表连接。然后从两个表中获取结果。

答案 1 :(得分:0)

这应该这样做。它也应该有很好的表现 (如果您的message表格已正确编入索引)。

SELECT t.*, m3.*
FROM
topic t
LEFT JOIN
(
   SELECT m1.id_topic, max(m1.id) id
   FROM
   message m1
   GROUP BY m1.id_topic
) m2 ON t.id = m2.id_topic
LEFT JOIN message m3 ON m2.id = m3.id