Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将一个表连接到另一个表的MAX记录_Mysql_Sql_Optimization_Join_Aggregate Functions - Fatal编程技术网

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

Mysql 将一个表连接到另一个表的MAX记录,mysql,sql,optimization,join,aggregate-functions,Mysql,Sql,Optimization,Join,Aggregate Functions,假设我有一个用于在线论坛的MySQL数据库,其中有两个表: topic : id, ... message : id, id_topic, created, ... 正如您所期望的,一个主题可以有许多(或没有)消息 我想获得一个列表,列出每个主题记录与最近创建的消息记录(如果没有消息,则加入为空)。我需要结果中两个记录的所有字段 我一直在做的是使用一个子查询来生成一个包含所有最近创建的消息的表,然后将其连接到主题表。然而,当主题表有几千行而消息表有几十万行时,它实际上陷入了困境 从性能的角度来

假设我有一个用于在线论坛的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_主题创建了最大值。然后,表消息与相同的临时表连接。然后从两个表中提取结果。

您使用的是哪种数据库管理系统?博士后?Oracle?关于索引的有趣点;也许这就是性能受到冲击的地方。我在id(unique,两个表)、id_topic、created和id_topic+created(子查询)上设置了索引,但可能我遗漏了一些内容。我只是通过ear来创建这些……尝试添加一个索引,覆盖id_主题(第一个)和Message表上的id谢谢,愤怒的公牛。我认为这是确认子查询是必要的。也许我看到的缓慢是来自其他地方(MySQL 5.5)。我觉得在id_topic+上创建的连接有点“笨拙”,但我也不知道有什么不同的方法。2条具有相同id\u topic+创建的时间戳(这种情况经常发生)的消息都会被第二次连接拾取,从而在结果中创建重复的行。将来,我可能会研究将“id\u message\u latest”列添加并维护到我的主题表中,并简化我的SQL。
 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