Определите спортсменов , занявших одну из первых трех позиций для каждого типа этапа

#sql

#sql

Вопрос:

Мне нужно решить этот запрос:

определение спортсменов, занявших одну из первых трех позиций для каждого типа этапа.

Я думал сделать это так, но ни один спортсмен не может меня найти.

 SELECT c.name_cyclist
FROM arrival_order oa
JOIN tape s ON oa.tape_name = s.tape_name
JOIN cyclist c ON oa.cyclist_id = c.cyclist_id
WHERE oa.order IN (1, 2, 3)
GROUP BY c. name_cyclist
HAVING COUNT (DISTINCT type) = (SELECT COUNT (*) FROM stage);
 

Таблицы:

  • cyclist (cyclist_id: Int, name_cyclist: строка, команда: строка из трех букв, страна: строка из трех букв)
  • лента (_name: строка, km: int, тип: ‘flat’ или ‘high_mountain’ или ‘medium_mountain’ или ‘chronometro_a_team’ или ‘chronometro_individual’ или ‘time trial’)
  • arrival_order (cyclist_id; tape_name, order: int): где cyclist_id (соответственно, tape_name) — это внешний ключ, который ссылается на cyclist (соответственно, tape);

Комментарии:

1. Что означает «ни один спортсмен не может меня найти»?

2. Не уверен в «(ОТДЕЛЬНЫЙ тип) = (ВЫБЕРИТЕ COUNT ( ) ИЗ этапа)» потому что type — это строка, а COUNT( ) — это int .

3. я не нахожу ни одного спортсмена

4. Добавьте c.cyclist_id group by и проверьте, возвращает ли запрос какую-либо запись. Также нет столбца, подобного c.name_cyclist

5. Я неправильно написал в таблице (name_cyclist) … Я добавил c.cyclist_id но ничего не возвращается…

Ответ №1:

Вы также должны добавить группировку по этапам type (или tape_name , как вы там называете).:

 SELECT c.name_cyclist  
FROM arrival_order oa  
JOIN stage s ON oa.tape_name = s.tape_name  
JOIN cyclist c ON oa.cyclist_id = c.cyclist_id  
WHERE oa.order IN (1, 2, 3)  
GROUP BY c. name_cyclist, s.type
HAVING COUNT (1) = (SELECT COUNT (DISTINCT type) FROM stage);  
 

Комментарии:

1. он ничего не возвращает

2. Возвращается ли он без having детали?

3. да, возвращаются велосипедисты, финишировавшие в тройке лучших на всех этапах

4. Это хорошо. Теперь количество рядов для каждого велосипедиста должно быть равно количеству этапов, верно?

5. что ж, это прекрасно. Вы можете использовать этот запрос как подзапрос, чтобы получить только спортсменов. например: select name_cyclist from (the_upper_query) as t group by t.name_cyclist