如何连接每个外键的最新记录而没有内部选择使用group by然后on子句?

时间:2018-02-23 10:59:09

标签: mysql sql

我有两个表 r_instance (id为主键,name,user_id,..等)和 r_response (id,comment,r_instance_id为外键)。 每个r_instance行都有多个r_response行(比如min of 3)。

我想在使用r_instance加入r_response时获取最新的ID和评论。 但是不使用GROUP BY,然后在r_response上使用on子句,因为它会降低查询性能。因此,当使用EXPLAIN考虑查询性能时,type列不应具有 ALL 值。

我的查询是:

SELECT ri.id, ri.name, rr.id, rr.comment
FROM r_instance ri 
JOIN (SELECT MAX(id) maxResponseId, r_instance_id instanceId
      from r_response
      GROUP BY r_instance_id) lastRes ON lastRes.instanceId = ri.id
JOIN r_response rr ON rr.id = lastRes.maxResponseId

2 个答案:

答案 0 :(得分:0)

您可以使用名为<base href="http://localhost:81/etl/"> MySQL 8.0 +

的窗口函数
row_number()

答案 1 :(得分:0)

这是另一种方法:

SELECT ri.id, ri.name, rr.id, rr.comment
FROM r_instance ri JOIN
     JOIN r_response rr
     ON ri.id = rr.r_instance_id
WHERE rr.id = (SELECT MAX(rr2.id)
               FROM r_response rr2
               WHERE rr2.r_instance_id = rr.r_instance_id
              );

为了提高性能,您需要r_response(r_instance_id, id)上的索引。

我应该注意,这并不总是能提供最佳性能。这是表达相同逻辑的另一种策略,导致不同的执行计划。这可能会带来更好的表现。