数据库特定的数据选择

时间:2013-10-17 15:06:09

标签: mysql sql

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

recordId, vehicleId, dateOfTireChange, expectedKmBeforeNextChange, tireType

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

我试过这种方法

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

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

知道如何进行此选择吗?

1 个答案:

答案 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禁用此优化。