Mysql 选择查找不存在id的结果
在我的数据库中,我收集在steam中请求的歌曲。每首歌曲都是由已知用户请求的。我想实现每个用户都可以对请求的歌曲进行评分的功能。在这种情况下,您可以查看我的数据库模型: 现在,我想选择一个特定的song_请求,该请求由其id标识,以及该歌曲的平均评分以及该歌曲的评分频率。为此,我希望使用以下SQL: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
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。通常情况下,您将使用分组依据
,否则您将始终得到一行。