确定。这是一项家庭作业。我已经尝试查找所有内容,但无法弄清楚错误。 架构如下:
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,但我可能错了。
答案 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;
我会选择第一个使用较短查询得到相同结果的人。 (不计算变量名称)