我有一个数据库,其中一个表具有以下结构:
recordId, vehicleId, dateOfTireChange, expectedKmBeforeNextChange, tireType
我想从表中做出这样的选择,我只得到包含每个vehicleId的最近日期的行。
我试过这种方法
SELECT vehicleid,
Max(dateoftirechange) AS lastChange,
expectedkmbeforenextchange,
tiretype
FROM vehicle_tires
GROUP BY vehicleid
但它没有选择与最近日期相关联的公里数,因此它不起作用。
知道如何进行此选择吗?
答案 0 :(得分:3)
有几种方法可以获得理想的结果。
相关标量子查询...
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()
{{1}的主题的列服务器假定MAX()
AVG()
等是您在已建立的组的每一行中知道 相同的列通过COUNT()
条款。
例如,如果我正在进行这样的查询......
GROUP BY
编写此查询的正确方式是GROUP BY p.id,p.full_name,p.date_of_birth,因为这些列都不是聚合函数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;
的一部分。
根据定义,MySQL优化允许您排除那些您知道必须在COUNT()
的每个组上相同的列,并且服务器将填充这些列来自组中任何行的数据。哪一行没有定义。正如您所看到的,在示例中,父组件的full_name在group-by parent.id中的所有行中都是相同的,这是此优化合法的情况。理由是它允许服务器在执行分组时必须处理较小的值(较少的字节)...但是在像你这样的查询中,未分组的列在每个组中具有不同的值,你得到的结果无效,设计。
GROUP BY
ONLY_FULL_GROUP_BY
禁用此优化。