2016-09-30 3 views
2

У меня есть две таблицы. Стол под названием laps, в котором хранится запись всех кругов, завершена по дорожке автомобилем и таблицей best_time, которая состоит из самых быстрых раз для определенных расстояний на этом круге. Например, он будет содержать самые быстрые 1k на этом круге или самую быструю половину мили.MySQL выбирает строку, где одно поле меньше, чем предыдущая запись, и одно поле больше

Я хочу выбрать из этих таблиц максимальная скорость для каждого расстояния. Таким образом, он покажет вашу личную прогрессию на этом расстоянии на этом круге с течением времени. Например, ваш самый быстрый 1к, возможно, был установлен в январе, а затем вы разбили его в июне и снова в августе. Ниже то, что структура 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

Это покажет все строки, в которых истекшее время меньше, чем все предыдущие истекшее время, на общее расстояние и коленей ид для автомобиля = 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, может быть, он может быть удален

+0

Спасибо за вашу настойчивость :) Это то, что мне нужно, и чтение через решение имеет смысл – Pattle

+0

, пожалуйста, рад, что мы решили это в конце! – Jayvee

Смежные вопросы