2017-01-09 6 views
0

У меня эта сложная ситуация с несколькими JOINS, и я немного застрял.Получите MIN() при использовании double GROUP BY

У меня есть эти таблицы:

Расы

id | system_id | track | race_name | race_date 
---------------------------------------------- 
1 | 3   | Track1| Name  | 2016-10-07 
2 | 5   | Track1| Name  | 2016-10-08 
3 | 6   | Track1| Name  | 2016-10-09 

Гонщики

id | system_id | racer_name | gender | bday  | from | laps_completed 
------------------------------------------------------------------------ 
1 | 10002  | Name1  | 1  | 1996-10-07|Place | 14 
2 | 10003  | Name2  | 0  | 1996-10-08|Place2| 33 
3 | 10004  | Name3  | 1  | 1996-10-09|Place3| 44 

RACERS_RACES

id | race_id | racer_id 
----------------------- 
1 | 3  | 10002 
2 | 5  | 10004 
3 | 6  | 10003 

LAPS

id | lap_time | system_id | racer_id 
------------------------------------ 
1 | 25.33 | 1   | 10002 
2 | 23.11 | 3   | 10003 
3 | 28.55 | 7   | 10004 

Я попытался сделать этот запрос:

SELECT r.system_id,MIN(l.lap_time) as fastest_lap,ra.racer_name,ra.racer_from,r.race_name,ra.laps_completed,r.race_date 
FROM races r 
LEFT JOIN racers_races rr ON r.system_id=rr.race_id 
LEFT JOIN racers ra ON rr.racer_id=ra.system_id 
LEFT JOIN laps l ON ra.system_id=l.racer_id 
WHERE l.lap_time!=0 
GROUP BY r.system_id,l.racer_id 
ORDER BY l.lap_time ASCenter code here 

Моя проблема, когда у меня есть несколько гонщиков у меня есть тот же самый быстрый круг для различных рас и оно не должно быть, что way.It должен вернуть мне самый быстрый кругом гонщика на определенной гонке.

Ссылка на sqlfiddle.

+0

См http://meta.stackoverflow.com/questions/333952/why-should-i-provide- a-mcve-for-what-seem-to-me-to-be-a-very-simple-sql-query – Strawberry

ответ

1

MIN и «двойная группа» не проблема.

Похоже, что вам не хватает условия соединения. Похоже, что соединение с laps должно включать сопоставление с конкретным races. Я вижу только условие присоединения к заданному racers.

Если был race_id столбца в laps, то что-то вроде этого:

... 
    LEFT JOIN laps l 
     ON l.racer_id = ra.system_id 
     AND l.race_id = rr.race_id 
    WHERE l.lap_time != 0 
    ... 

Для меня, это выглядит, как мы на самом деле хотим присоединиться от laps быть в racers_races таблицы. Время круга не зависит от гонщика ... это зависит как от гонщика, так и от гонки ... участие гонщиков в гонке.

Если нет способа сопоставления laps с определенной строкой в ​​racers_races, возникает проблема со схемой.

Другая возможность (конечно) состоит в том, что схема верна. И запрос просто вернет самый быстрый круг для гонщика, поэтому запрос вернет то же самое самое быстрое время для заданного racers, для каждого races.


Также обратите внимание, что условие в предложении WHERE отрицает изящество LEFT JOIN. Если вы действительно хотите, чтобы быть «внешнее» соединение, затем переместите это условие в п ON

... 
    LEFT JOIN laps l 
     ON l.racer_id = ra.system_id 
     AND l.<race_id> = rr.race_id 
     AND l.lap_time != 0 
    WHERE 1=1 
    ... 
+0

Я пробовал ваше предложение, но оно не работает. Возможно, вы запутались в столбец system_id. Он разделен для каждая таблица, это как второй первичный идентификатор, за исключением таблицы racers, могут быть одинаковые системные_ид. – Shile

+0

Исходный запрос имеет условие соединения от 'laps' до только' racer', поэтому строка из круга будет соответствовать всем гонкам для этого гонщика.Похоже, нам также понадобится условие, которое соответствует 'lap' для определенного' race_id'. (Единственный другой столбец, который я видел в 'laps', который выглядит как внешний ключ, - это столбец' system_id' ... с учетом значений 1, 3, 7 в данных примера, неясно, какой столбец должен совпадать в какая другая таблица. Может быть, для схемы требуется столбец 'race_id' в' laps'? Мне кажется, что в 'laps' должен быть столбец внешнего ключа, который ссылается на таблицу' racers_races'.) – spencer7593

+0

Да, вы были правы. Я добавил ** race_id ** в таблицу ** laps **, а затем ссылался на таблицу ** racers_races **, и теперь она работает так, как должна была. У меня также была другая ошибка: ** laps_completed ** should быть в таблице ** racers_races ** не в ** гонщиках **. В любом случае, спасибо большое. – Shile