我正在处理的两个表是:
提交:
+----+------------+
| id | student_id |
+----+------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------------+
组提交:
+----+---------------+------------+
| id | submission_id | student_id |
+----+---------------+------------+
| 1 | 1 | 2 |
| 2 | 2 | 1 |
+----+---------------+------------+
只有一名学生实际提交并进入提交表格,而其他学生则进入小组提交表格(如果提交是小组提交(
我想统计一下作为一个小组或单独提交的学生的唯一数量
我希望最后只返回数字(3基于上表中的数据(
如果提交表格中的学生在小组提交表格中,则不应将其计算两次,反之亦然。
此外,只完成了个人提交(不在小组提交表中(的学生也应被计算在内,无论他们是否曾参加过小组提交
我已经在构建的查询中对这些表进行了一些其他操作,所以如果你能给我一个基于连接这两个表的解决方案,那将有所帮助。
这就是我尝试过的:
count(distinct case when group_submissions.student_id is not null then group_submissions.student_id end) + count(distinct case when submissions.student_id is not null then submissions.student_id end)
但它给了我重复的数据,所以如果一个学生同时在两张表中,他会被计算两次。
有什么想法吗?
注意:这是一个MySQL数据库。
我想你想要union
和一个计数:
select count(*)
from ((select student_id
from submissions
)
union -- on purpose to remove duplicates
(select student_id
from group_submissions
)
) s;
听了澄清之后,我认为强迫自己使用联接来计算这一点是不明智的。相反,您可以将计数作为一个简单的表达式作为最终结果。使用UNION然后使用distinct将有助于构建这样的表达式。
下面的旧答案不适合这个问题:
需要对当前版本进行非常简单的修复。。。
count(distinct case when group_submissions.student_id is not null then group_submissions.student_id when assignment_submissions.student_id is not null then assignment_submissions.student_id end)
注:
- 您的原始表达式是两个大小写表达式之间的加法,每个表达式内部都有一个WHEN
- 现在我把它变成一个带有2个WHEN的``SQL的大小写表达式