Mysql 选择查找不存在id的结果

Mysql 选择查找不存在id的结果,mysql,sql,select,join,Mysql,Sql,Select,Join,在我的数据库中,我收集在steam中请求的歌曲。每首歌曲都是由已知用户请求的。我想实现每个用户都可以对请求的歌曲进行评分的功能。在这种情况下,您可以查看我的数据库模型: 现在,我想选择一个特定的song_请求,该请求由其id标识,以及该歌曲的平均评分以及该歌曲的评分频率。为此,我希望使用以下SQL: SELECT sr.id, sr.user_id, sr.title, sr.link, sr.request_time, COALES

在我的数据库中,我收集在steam中请求的歌曲。每首歌曲都是由已知用户请求的。我想实现每个用户都可以对请求的歌曲进行评分的功能。在这种情况下,您可以查看我的数据库模型:

现在,我想选择一个特定的song_请求,该请求由其id标识,以及该歌曲的平均评分以及该歌曲的评分频率。为此,我希望使用以下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_请求表中,我有以下数据:

在sr_评级表中,有一些示例评级:

如果我用

sr.id = 1 
在WHERE子句中,我得到了以下预期结果:

如果我现在使用不存在的song_请求的id

sr.id = 12345
我将得到以下结果:


我希望查询不会找到任何结果,因为id不存在。我哪里出了问题?我需要做什么才能得到所需的结果?

关键字
LEFT JOIN
LEFT OUTER JOIN
返回左表中的所有记录,以及右表中的匹配记录。如果没有匹配项,则右侧的结果为
NULL


您可以在
CASE
语句中尝试
不为NULL
。还有一个问题可以回答你的问题

这里有多个问题。首先,您显然在使用MySQL,因为在几乎任何其他数据库中,代码都是假的。您有一个聚合函数,以及非聚合列和无
groupby
子句

我猜你想要这样的东西:

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;
瞧!你会发现这解决了你的问题。这将不返回任何行


您的代码返回一行,因为它是一个聚合查询,没有
分组依据
。即使没有匹配项,也始终只返回一行。原来问题不在于
左连接
;这是
分组方式的不当使用

问题在于左侧连接(1)将您的问题标记到您正在使用的数据库中(没有其他数据库)。(2) 只需切换到内部连接。内部连接返回完全相同的结果感谢有关图像和缺少标记的提示。这确实修复了它,非常感谢。只是想弄清楚:使用AVG或COUNT等聚合函数意味着我必须使用group by?@IonicBlaze。通常情况下,您将使用
分组依据
,否则您将始终得到一行。