我刚开始学习MySQL课程,并且对join和sub-queries语句有点挣扎。
对于这个问题,我的答案为什么不正确?:
我的回应:
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;
查询最显着的问题是它缺少GROUP BY
子句,而它在COUNT()
子句中具有聚合函数(SELECT
)。这只是无效的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;