MySQL选择行,其中一个字段小于前一个记录,一个字段更大

时间:2016-09-30 21:59:35

标签: mysql sql

我有两张桌子。一张名为laps的表格,其中包含一辆汽车和一张名为best_time的表格围绕赛道完成的所有圈数记录,其中包括该圈上某些距离的最快时间。例如,它将包含该圈中最快的1k,或最快的半英里。

我想从这些表中选择每个距离的最快时间进度。因此,随着时间的推移,它将显示您在该圈上的那个距离的个人进展。例如,您最快的1k可能是在1月份设置的,然后您在6月份和8月份再次打破了它。下面是best_times表结构的样子

best_time_id    int(10)     
lap_id  int(11)
start_time  int(10)
end_time    int(10)
total_distance  decimal(7,2)
total_elapsed_time decimal(11,2)

我需要选择total_elapsed_time小于上一条记录且start_time更大的记录。这是我到目前为止的查询

SELECT `bt`.`total_distance`, `bt`.`total_elapsed_time`, `bt`.`start_time` 
        FROM `best_times` AS `bt`, `laps` AS `l` 
        WHERE (
            SELECT COUNT(*) FROM `best_times` AS `bt2` 
            WHERE `bt2`.`total_distance` = `bt`.`total_distance` 
            AND `bt2`.`total_elapsed_time` <= `bt`.`total_elapsed_time` 
            AND `bt2`.`start_time` > `bt`.`start_time`
        ) <= 10 AND `l`.`lap_id` = `bt`.`lap_id` AND `l`.`car_id` = 1 ORDER BY `bt`.`total_distance` ASC, `bt`.`total_elapsed_time` desc

这种作品,但它选择了不应该的记录。我回来的结果集的一个例子是

| total_distance | total_elapsed_time | start_time |
|----------------|--------------------|------------|
| 1000.00        | 99.15              | 1431344798 |
| 1000.00        | 98.25              | 1431604966 | This record shouldn't be here because although it's quicker it happened after the 91.40 time
| 1000.00        | 91.40              | 1431433535 |

我已经关闭,但任何人都可以看到我出错的地方。如果我需要提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

这将显示经过时间小于所有先前经过时间的所有行,按汽车的总距离和圈数id = 1:

SELECT `bt`.`total_distance`, `bt`.`total_elapsed_time`, `bt`.`start_time` 
FROM `best_times` AS `bt`, `laps` AS `l` 
WHERE `bt`.`total_elapsed_time` <= (Select min(`bt2`.`total_elapsed_time`) from `best_times` AS `bt2` where `bt2`.`start_time` <= `bt`.`start_time` 
AND `bt2`.`total_distance` = `bt`.`total_distance`  )
AND `l`.`lap_id` = `bt`.`lap_id` 
AND `l`.`car_id` = 1 
ORDER BY `bt`.`total_distance` ASC, `bt`.`total_elapsed_time` desc

我不太确定什么是lap_id,也许它可以删除