在我的数据库中,我收集了蒸汽期间请求的歌曲。每首歌曲均由已知用户请求。我想实现每个用户都可以评价所请求歌曲的功能。在这种情况下,您可以看一下我的数据库模型:
现在,我想选择一个由其ID标识的特定song_request以及该歌曲的平均评分以及该歌曲的评分频率。为此,我想使用以下SQL:
SELECT
sr.id,
sr.user_id,
sr.title,
sr.link,
sr.request_time,
COALESCE(AVG(r.rating), 0) AS rating,
COUNT(r.sr_id) AS votes
FROM song_requests sr LEFT OUTER JOIN sr_ratings r
ON sr.id = r.sr_id
WHERE sr.id = 12345;
在我的song_requests表中,我有以下数据:
在sr_ratings表中,有一些示例等级:
如果我执行SQL
sr.id = 1
在WHERE子句中,我得到以下预期结果:
如果我现在使用不存在的song_request的ID
sr.id = 12345
我将得到以下结果:
我期望查询找不到任何结果,因为该ID不存在。我在哪里错了?我需要怎么做才能获得理想的结果?
最佳答案
这里有多个问题。首先,您显然正在使用MySQL,因为该代码在几乎所有其他数据库中都是伪造的。您具有聚合功能,以及未聚合的列,并且没有GROUP BY
子句。
我猜你想要这样的东西:
SELECT sr.id, sr.user_id, sr.title, sr.link, sr.request_time,
COALESCE(AVG(r.rating), 0) AS rating,
COUNT(r.sr_id) AS votes
FROM song_requests sr LEFT OUTER JOIN
sr_ratings r
ON sr.id = r.sr_id
WHERE sr.id = 12345
GROUP BY sr.id, sr.user_id, sr.title, sr.link, sr.request_time;
瞧!您会发现这可以解决您的问题。这将不返回任何行。
您的代码返回一行,因为它是不带
GROUP BY
的聚合查询。即使没有匹配项,它始终只返回一行。事实证明,问题不是出在LEFT JOIN
上。这是GROUP BY
的错误用法。关于mysql - SELECT查找不存在的ID的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43867574/