有几种方法可以获得所需的结果。
相关标量子查询...
SELECT vt1.*
FROM vehicle_tire vt1
WHERE vt1.recordId = (SELECT vt2.recordId
FROM vehicle_tire vt2
WHERE vt2.vehicleId = vt1.vehicleId
ORDER BY vt2.dateOfTireChange DESC limit 1);
...或派生表...
SELECT vt2.*
FROM vehicle_tire vt2
JOIN (SELECT vt1.vehicleId as vehicleId,
MAX(vt1.dateOfTireChange) as maxDateOfTireChange
FROM vehicle_tire vt1
GROUP BY vt1.vehicleId) dt ON vt2.vehicleId = dt.vehicleId
AND vt2.dateOfTireChange = dt.dateOfTireChange;
...是两个浮现在脑海中。
GROUP BY
应用于整个表时的原因是不正确的,因为您不使用的任何列GROUP BY
,也不是聚合函数MIN()
MAX()
AVG()
COUNT()
等的主题,被服务器假定为您知道在每一行中相同的GROUP BY
列子句建立的组。
例如,如果我正在做这样的查询......
SELECT p.id,
p.full_name,
p.date_of_birth,
COUNT(c.id) AS number_of_children
FROM parent p LEFT JOIN child c ON c.parent_id = p.id
GROUP BY p.id;
编写此查询的正确方法是 GROUP BY p.id, p.full_name, p.date_of_birth,因为这些列都不是聚合函数的一部分COUNT()
。
MySQL 优化允许您排除那些您知道根据定义在每个组上必须相同的列,并且服务器将使用组中任何行的GROUP BY
数据填充这些列。未定义哪一行。如您所见,在示例中,父级的 full_name 在 group-by parent.id 中的所有行中都是相同的,这是这种优化合法的情况。理由是它允许服务器在执行分组时必须处理更小的值(更少的字节)......但是在像你这样的查询中,未分组的列在每个组中具有不同的值,你会得到一个无效的结果,通过设计.
SQL_MODE
ONLY_FULL_GROUP_BY
禁用此优化。