我正在尝试编写一个查询来查找自行车前叉上的里程数。此数字的计算方法是,将distance_reading
与安装前缀的日期相关联(reading_date
与Bicycle_Fork.start_date
记录关联的最低Bicycle_Fork
和从删除前叉的日期减去该值(reading_date
之前或之前的最大值Bicycle_Fork.end_date
,如果为空,则为最接近今天的日期的读数。我已设法将odometer_reading
的范围限制为适当的范围,但我无法弄清楚如何找到代表叉子安装时的每个里程表的最小和最大日期。当我只需要查看与start_date
或end_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
答案 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;