0

我有一个数据库,其中一个表具有以下结构:

recordId, vehicleId, dateOfTireChange, expectedKmBeforeNextChange, tireType

我想从表中做出这样的选择,我只得到包含每个车辆 ID 的最近日期的 thouse 行。

我试过这种方法

SELECT vehicleid, 
       Max(dateoftirechange) AS lastChange, 
       expectedkmbeforenextchange, 
       tiretype 
FROM   vehicle_tires 
GROUP  BY vehicleid 

但它不会选择与最近日期关联的公里数,因此它不起作用。

知道如何进行此选择吗?

4

1 回答 1

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() 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禁用此优化。

于 2013-10-17T18:27:21.607 回答