基本的mySQL - 不知道如何显示包括0的所有结果

时间:2014-02-13 03:35:02

标签: mysql sql database

确定。这是一项家庭作业。我已经尝试查找所有内容,但无法弄清楚错误。 架构如下:

course{
 course_id
 title
 dept
}

section{
 course_id
 semester
 year
}

课程表包含所有提供的课程。 部分表包含过去和未来的课程。

我要列出每门课程的提供次数。即使以前从未提供过。 (包括零)。

因此。到目前为止我所拥有的是分别执行每个部分的子查询,但是我很难合并这两个部分。 (这就是我需要你帮助的地方。)(旁注:我是sql的新手,如果查询看起来效率低下,很抱歉)

所以我知道如何获得所有课程并对其进行排序。

SELECT course_id FROM course ORDER BY course_id;

我也知道如何计算课程的所有次数。

SELECT course_id, COUNT( course_id )FROM section GROUP BY course_id;

所以我想,使用两个子查询来制作结果!

SELECT * FROM 
(
SELECT course_id, COUNT( course_id ) FROM section GROUP BY course_id
) AS T1 
NATURAL JOIN 
(
SELECT course_id FROM course ORDER BY course_id
) as T2;

但忽略了数为0的课程。我尝试过使用IFNULL,但我可能错了。

3 个答案:

答案 0 :(得分:1)

你可以做(从大多数到不太喜欢)

SELECT c.course_id, COUNT(s.course_id) total
  FROM course c LEFT JOIN section s 
    ON c.course_id = s.course_id
 GROUP BY c.course_id;

SELECT c.course_id, COALESCE(total, 0) total
  FROM course c LEFT JOIN 
(
  SELECT course_id, COUNT(*) total
    FROM section
   GROUP BY course_id
) s
    ON c.course_id = s.course_id;

SELECT course_id,
(
  SELECT COUNT(*)
    FROM section
   WHERE course_id = c.course_id
) total
  FROM course c;

注意:在第一个查询中,您必须在使用course_id时从section表计算section而不是LEFT JOIN

这是 SQLFiddle 演示

答案 1 :(得分:0)

你只是希望将你的查询基于这些部分,并且LEFT JOIN甚至可以在连接的右侧显示尚未有课程的部分

SELECT section.course_id, COUNT(course.id) FROM section
    LEFT JOIN course ON course.course_id = section.course_id
    GROUP BY section.course_id

答案 2 :(得分:0)

这是我设法找出有效的答案。

SELECT T1.course_id , IFNULL( t2Count , 0 ) FROM 
(
SELECT course_id FROM course ORDER BY course_id
) AS T1 
LEFT JOIN 
(
SELECT course_id, COUNT( course_id ) as t2Count FROM section GROUP BY course_id
) as T2 
ON 
T1.course_id=T2.course_id;

我会选择第一个使用较短查询得到相同结果的人。 (不计算变量名称)