SQLite按类别计算影片平均时长结果相同,求SQL语句修正
问题排查与解决
你的SQL语句存在笛卡尔积关联的问题,导致所有类别计算的都是全量影片的平均时长,而非对应类别的影片平均时长。
问题原因
你只关联了film和film_category,但category表和film_category表之间没有建立关联条件。这会让每一条影片记录(关联到film_category后)都和所有类别记录进行匹配,最终按类别分组时,每个类别下都包含了所有影片的数据,所以平均时长完全一致。
修正后的SQL语句
需要在WHERE子句中添加fc.category_id = c.category_id,建立film_category和category的关联:
SELECT c.name, AVG(f.length) FROM film f, category c, film_category fc WHERE fc.film_id = f.film_id AND fc.category_id = c.category_id GROUP BY c.name
更清晰的写法(推荐)
使用显式的JOIN语法,能更直观地看到表之间的关联关系,避免这类遗漏:
SELECT c.name, AVG(f.length) FROM film f JOIN film_category fc ON fc.film_id = f.film_id JOIN category c ON c.category_id = fc.category_id GROUP BY c.name
这样每个类别只会关联到属于该类别的影片,计算出的就是对应类别的平均时长。
内容的提问来源于stack exchange,提问作者Simonziety
相关产品推荐
相关产品推荐

