MySQL查找与另一个表中的记录关联的最小和最大日期

时间:2014-09-25 17:29:31

标签: mysql date join

我正在尝试编写一个查询来查找自行车前叉上的里程数。此数字的计算方法是,将distance_reading与安装前缀的日期相关联(reading_dateBicycle_Fork.start_date记录关联的最低Bicycle_Fork和从删除前叉的日期减去该值(reading_date之前或之前的最大值Bicycle_Fork.end_date,如果为空,则为最接近今天的日期的读数。我已设法将odometer_reading的范围限制为适当的范围,但我无法弄清楚如何找到代表叉子安装时的每个里程表的最小和最大日期。当我只需要查看与start_dateend_date匹配的记录时,这很容易,但用户无需为每个更改零件的日期输入新的里程表读数。我现在已经在这个问题上工作了好几个小时了,而且我找不到一种方法来使用MIN()而不是从所有结果中取出最小的日期

问题:如何在保持reading_date创建的限制的同时,找到与每个reading_date关联的最小odometer_id和最大WHERE条款?

如果无法做到这一点,我打算将从第一个查询中检索到的值存储在PHP中的数组中并从那里处理它,但我希望能够在MySQL中找到一个解决方案。

这是一个SQL小提琴,其中包含数据库架构和查询的当前状态:http://sqlfiddle.com/#!2/015642/1

SELECT OdometerReadings.distance_reading, OdometerReadings.reading_date,
OdometerReadings.odometer_id, Bicycle_Fork.fork_id
    FROM Bicycle_Fork
    INNER JOIN (Bicycles, Odometers, OdometerReadings)
    ON (Bicycles.bicycle_id = Bicycle_Fork.bicycle_id
    AND Odometers.bicycle_id = Bicycles.bicycle_id AND OdometerReadings.odometer_id = Odometers.odometer_id)
    WHERE (OdometerReadings.reading_date >= Bicycle_Fork.start_date) AND
    ((Bicycle_Fork.end_date IS NOT NULL AND OdometerReadings.reading_date<= Bicycle_Fork.end_date) XOR (Bicycle_Fork.end_date IS NULL AND OdometerReadings.reading_date <= CURRENT_DATE()))

这是旧的查询,没有考虑数据库缺少与start_date或end_date对应的记录的可能性:

SELECT MaxReadingOdo.distance_reading, MinReadingOdo.distance_reading
FROM
(SELECT OdometerReadings.distance_reading, OdometerReadings.reading_date,
OdometerReadings.odometer_id 
    FROM Bicycle_Fork
    LEFT JOIN (Bicycles, Odometers, OdometerReadings)
    ON (Bicycles.bicycle_id = Bicycle_Fork.bicycle_id
    AND Odometers.bicycle_id = Bicycles.bicycle_id AND OdometerReadings.odometer_id = Odometers.odometer_id)
    WHERE Bicycle_Fork.start_date = OdometerReadings.reading_date) AS MinReadingOdo
INNER JOIN
    (SELECT OdometerReadings.distance_reading, OdometerReadings.reading_date, 
    OdometerReadings.odometer_id 
    FROM Bicycle_Fork
    LEFT JOIN (Bicycles, Odometers, OdometerReadings)
    ON (Bicycles.bicycle_id = Bicycle_Fork.bicycle_id AND Odometers.bicycle_id 
    = Bicycles.bicycle_id AND OdometerReadings.odometer_id = Odometers.odometer_id)
    WHERE Bicycle_Fork.end_date = OdometerReadings.reading_date) AS 
    MaxReadingOdo
ON MinReadingOdo.odometer_id = MaxReadingOdo.odometer_id

我试图让以下内容从SQL架构返回: 我最终会将这些数字加到一个数字中,但我已经分别使用它们来更容易检查数值。

min_distance_reading    | max_distance_reading  | odometer_id
=============================================================
75.5                    | 2580.5                | 1
510.5                   | 4078.5                | 2
17.5                    | 78.5                  | 3

1 个答案:

答案 0 :(得分:2)

我不理解拼图的最后部分,但这似乎很接近......

SELECT MIN(ro.distance_reading) min_val
     , MAX(ro.distance_reading) max_val
     , ro.odometer_id 
  FROM OdometerReadings ro
  JOIN odometers o
    ON o.odometer_id = ro.odometer_id
  JOIN Bicycle_Fork bf
    ON bf.bicycle_id = o.bicycle_id
   AND bf.start_date <= ro.reading_date
 GROUP
    BY ro.odometer_id;

http://sqlfiddle.com/#!2/015642/8