在我的数据库中,我收集了蒸汽期间请求的歌曲。每首歌曲均由已知用户请求。我想实现每个用户都可以评价所请求歌曲的功能。在这种情况下,您可以看一下我的数据库模型:

mysql - SELECT查找不存在的ID的结果-LMLPHP

现在,我想选择一个由其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表中,我有以下数据:

mysql - SELECT查找不存在的ID的结果-LMLPHP

在sr_ratings表中,有一些示例等级:

mysql - SELECT查找不存在的ID的结果-LMLPHP

如果我执行SQL

sr.id = 1


在WHERE子句中,我得到以下预期结果:

mysql - SELECT查找不存在的ID的结果-LMLPHP

如果我现在使用不存在的song_request的ID

sr.id = 12345


我将得到以下结果:

mysql - SELECT查找不存在的ID的结果-LMLPHP

我期望查询找不到任何结果,因为该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/

10-16 23:07