sql - 一个查询中的 LEFT JOIN 和 INNER JOIN
问题描述
我有 3 个表:courses
,,users
(course_ratings
此表具有用户和课程的外键,以及rating
包含用户对课程的评分的列)
我想获得所有课程,即使是那些与course_ratings
表格无关的课程,但如果这门课程是相关的,那么我想获得与这门课程相关的所有用户的平均评分和计数。这是我的 SQL 查询:
SELECT c.title, COALESCE (AVG(cr.rating), 0), COUNT(u.user_id)
FROM courses c
LEFT JOIN course_ratings cr ON c.course_id = cr.course_id
JOIN users u ON u.user_id = cr.user_id
GROUP BY c.course_id;
如您所见,我什至尝试获取那些没有任何评分的课程并将其评分为 0。但结果,我只有至少有一个评分的课程。
解决方案
使用两个left join
s:
SELECT c.title, COALESCE(AVG(cr.rating), 0), COUNT(u.user_id)
FROM courses c LEFT JOIN
course_ratings cr
ON c.course_id = cr.course_id LEFT JOIN
users u
ON u.user_id = cr.user_id
GROUP BY c.title;
我更改了GROUP BY
列以匹配SELECT
.
请注意,您实际上并不需要该users
表:
SELECT c.title, COALESCE(AVG(cr.rating), 0), COUNT(cr.user_id)
FROM courses c LEFT JOIN
course_ratings cr
ON c.course_id = cr.course_id
GROUP BY c.title;
您需要的信息实际上在course_ratings
(好吧,假设该user_id
表中的所有 s 都是有效的,这似乎是一个合理的假设)。
推荐阅读
- javascript - 将返回值传递给javascript中的函数参数
- postgresql - 在 Windows 7 上的 PostgreSql 10 中执行命令后,“*#”是什么意思?
- c# - 使用具有未指定类型参数的泛型作为字典中的值
- talend - Talend - 从 tLogRow/tSort 中提取文件名
- javascript - 如何播放音频javascript
- javascript - 在javascript中同步读取本地文本文件
- php - 面临 PHP 5.6 到 7.x 版本的代码问题
- jquery - 使用 AJAX 源将 JSON 数据加载到 JQuery DataTables
- java - 使用某些字体时 iReport 崩溃
- php - 如何在作曲家中更改代理