首页 > 解决方案 > 一个查询中的 LEFT JOIN 和 INNER JOIN

问题描述

我有 3 个表:courses,,userscourse_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。但结果,我只有至少有一个评分的课程。

标签: sqljoin

解决方案


使用两个left joins:

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 都是有效的,这似乎是一个合理的假设)。


推荐阅读