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

标签 mysql sql optimization join aggregate-functions

假设我有一个用于在线论坛的 MySQL 数据库,其中包含两个表:

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

如您所料,一个主题可能有许多(或没有)消息

我想获取每个主题记录的列表,该记录左连接到其最近创建的消息记录(或连接如果没有消息,则什么也不做)。我需要结果中两条记录的所有字段。

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

着眼于性能,解决此问题的正确方法是什么?

最佳答案

试试这个:

 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 创建的最大数量的临时表连接起来。然后表消息与同一个临时表连接。然后从两个表中获取结果。

关于mysql - 将一个表连接到另一个表的 MAX 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23776821/

相关文章:

sql - 分析表,优化表,多久一次?

c++ - 不会被优化掉的最简单的 "unused"代码是什么?

mysql - 如何使用此 Select 创建动态 WHERE?

mysql - 我怎样才能以另一种方式编写这个查询

mysql - 在同一个 sql 查询中使用别名

matlab - 如何沿着数组的某个维度进行操作?

python - 如何加速 Cython 代码来计算 dirichlet 的条件对数似然?

mysql - 如何使用第二个表中的 select group by 作为 MySQL 中的数据源来更新表?

mysql - 查询替换表中的特定字符

mysql - 使用 MIN() 函数删除查询