我有一张电影和一张选票表。用户投票选择他们喜欢的电影。 我需要显示电影的总票数下降的电影列表。 我现在有什么作品。唯一的问题是它没有显示0票的电影。
SELECT m.name, m.imdb_url, m.comment, COUNT(v.movie_id) AS votes
FROM movies m, votes v
WHERE v.movie_id=m.movie_id
GROUP BY v.movie_id
ORDER BY votes DESC
答案 0 :(得分:5)
你需要做一个外连接;你编码的是隐式内连接。
LEFT OUTER JOIN将从“左”表中获取所有行,并从右表中获取任何匹配的记录。右表中缺少匹配记录的任何左表记录对于正确的表值将为空。您可以通过多种方式将这些空值转换为0。
答案 1 :(得分:1)
我相信你所期待的是left join。你的SQL看起来像:
SELECT m.name, m.imdb_url, m.comment, COUNT(v.movie_id) AS votes
FROM movies AS m
LEFT JOIN votes AS v ON m.movie_id = v.movie_id
GROUP BY v.movie_id
ORDER BY votes DESC
答案 2 :(得分:0)
对于没有投票的电影,您的表的值是0,还是使用NULL / EMPTY?
如果它记录零,那么使你的SQL像这样:
“选择电影WHERE投票> = 0”
答案 3 :(得分:0)
你可能需要做一个left join,其中包括左表(电影)中的记录,即使右表中没有匹配(投票)。
答案 4 :(得分:0)
根据和平主任的建议:
SELECT m.name, m.imdb_url, m.comment, COUNT(v.movie_id) AS votes
FROM movies m
left outer join votes v
on v.movie_id=m.movie_id
GROUP BY v.movie_id
ORDER BY COUNT(v.movie_id) DESC
我不确定mysql,但并非所有数据库都允许您使用ORDER BY
位中的别名,因此我已将votes
替换为COUNT(v.movie_id)
。