MySQL: Почему я ответил неверно: какой фильм чаще всего показывали в зале Чаплина в октябре 2017 года? - PullRequest
0 голосов
/ 26 мая 2020

Я только что закончил курс MySQL как новичок и немного боролся с операторами соединения и подзапросов.

На вопрос, почему мой ответ неверен?:

МОЙ ОТВЕТ:

SELECT f.name, r.name, COUNT(s.room_id) AS film_times FROM films f
JOIN screenings s ON f.id = s.film_id  
JOIN rooms r ON s.room_id = r.id
WHERE r.name = 'Chaplin';

РЕШЕНИЕ:

SELECT f.name, r.name, COUNT(r.name) AS film FROM films f
JOIN screenings s ON f.id = s.film_id  
JOIN rooms r ON s.room_id = r.id
WHERE r.id = 1
GROUP BY f.name
ORDER BY film DESC
LIMIT 1;

1 Ответ

1 голос
/ 26 мая 2020

Наиболее заметная проблема с вашим запросом состоит в том, что в нем отсутствует предложение GROUP BY, а в предложении SELECT есть агрегатная функция (COUNT()). Это просто неверный SQL. По сути, если вы хотите подсчитать строки, вам нужно указать критерии группировки

Кроме того, вам не хватает ORDER BY и LIMIT 1, которые позволяют выбрать фильм с наибольшим количеством случаев (то есть группы, содержащей большинство строк).

Предложения SELECT и FROM выглядят хорошо - решение фильтрует комнаты по id, а вы фильтруете по name, но оба должны быть в порядке (при условии, что

Наконец, позвольте мне указать, что это решение некорректно: не все неагрегированные столбцы появляются в предложении GROUP BY, хотя это обычное требование SQL ( хотя в старых версиях MySQL это не так). Кроме того, это группировка по названию фильмов, что (опять же) открывает возможность проблем, если два разных фильма имеют одинаковое имя. Это лучше было бы сформулировать:

SELECT f.name, r.name, COUNT(*) AS no_occurences FROM films f
JOIN screenings s ON f.id = s.film_id  
JOIN rooms r ON s.room_id = r.id
WHERE r.id = 1
GROUP BY f.film_d, f.name, r.name
ORDER BY no_occurences DESC
LIMIT 1;
...