让我们说我有一个MySQL数据库用于一个有两个表的在线论坛:
topic : id, ...
message : id, id_topic, created, ...
一个主题可能会有很多(或没有)消息,正如您所期望的那样。
我想获取每个主题记录的列表LEFT JOIN'以及最近创建的 消息记录(如果没有消息,则加入任何内容。我需要结果中两个记录的所有字段。
我一直在做的是使用子查询来创建所有最近创建的消息的表,然后将其加入主题表。然而,当主题表有几千行并且消息表有几十万时,它真的陷入困境。
解决这个问题的正确方法是什么,着眼于绩效?
答案 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