【发布时间】:2019-09-10 02:57:20
【问题描述】:
我有一个查询可以正确计算平台内每门课程的学生人数,但它不返回学生人数 = 0 的结果。如何修改以下查询以包含此内容?
SQL:
/* MSSQL
Name: Courses using the TDC themes with student enrolment count
Description: Returns a list of courses using a TDC theme and the number of enrolled students in each course.
*/
select
concat('<a target="_blank" href="%%wwwroot%%/course/index.php?categoryid=',cat.id,'">', cat.name,'</a>') as "Category",
concat('<a target="_new" href="%%wwwroot%%/course/view.php?id=',course.id,'">',course.fullname,'</a>') as "Course",
course.theme as "Theme",
count(course.id) as "Students"
from prefix_course as course
join prefix_context as context on context.instanceid = course.id
join prefix_role_assignments as ra on ra.contextid = context.id
join prefix_course_categories as cat on cat.id = course.category
where context.contextlevel = 50 and ra.roleid = 5 and course.theme like 'tdc%'
group by cat.id, cat.name, course.id, course.fullname, course.theme
order by cat.name
实际结果:
| Category | Course | # of Students |
|-----------|--------------------|---------------|
| Baking | Baking 101 | 7 |
| IT | Intro to Excel | 9 |
预期结果:
| Category | Course | # of Students |
|-----------|--------------------|---------------|
| Baking | Baking 101 | 7 |
| IT | Web Programming | 0 |
| IT | Intro to Excel | 9 |
| Chemistry | Chemical Reactions | 0 |
我已经搜索了一些关于 SO 的问题(例如 here),但无法根据我的情况翻译答案。
【问题讨论】:
-
您的一个表没有匹配的数据,请尝试在 prefix_role_assignments 上使用左连接
-
Protip:不要在 SQL 中生成视图级数据。在这种情况下,您将在 SQL 中生成 HTML。不要这样做,因为从长远来看,这会使您的代码的可维护性大大降低——如果您想从非 Web 应用程序运行查询怎么办?要点是:遵循单一职责原则。
-
@metal 不起作用,因为如果 prefix_course 中有任何记录,您最终会得到一个计数。但他要求的是计数为 0 的实例。我不确定这个问题的格式是否正确。 OP - 如果您期望 id 计数为 0(又名不存在),为什么会在 prefix_course 中有记录?
-
@kjmerf,啊,我明白你的意思了。我可能不得不重新考虑我是如何创建这个查询的。它最初是作为一个没有学生人数的查询(即,只有类别、课程和主题信息)开始的,这是数据库中一个更简单的查询。您对如何执行此操作有任何建议吗?我将添加一个 sqlfiddle 链接以包含 db 架构和一些虚拟数据。
-
有了预期的结果和样本数据应该是可行的。
标签: sql sql-server