mysql - sql计算多行课堂上的当前学生
问题描述
在barcodes
表中,我有两列女巫enter
,exit
就像学生出勤记录一样,
在此表中,当学生进入课堂时,我在表中添加了新行,并且值enter
与登录相同1
exit
0
从教室退出后,我检查了这个学生的最新行,如果enter
是,1
那么我在表中添加新行,其1
值exit
与注销类似
现在我想计算所有学生女巫enter
列是1
和exit
价值是0
让所有在校学生
样本数据:
在这个DB-FIDDLE中,我有示例数据,并且我有2
现在的学生,session_id
他们是1
,他们是123451
,123452
学生,但是我的 sql 命令作为第二部分是不正确的,并且返回一个在校学生:
(
select count(*)
from barcodes b
where b.session_id = s.id
group by session_id, barcode
having sum(exit) = 0
) as present
例如:
select s.id, s.session_name, s.session_type, s.date_time,
(
select count(*)
from barcodes b where b.session_id = s.id
) as barcode_count ,
(
select count(*)
from barcodes b
where b.session_id = s.id
group by session_id, barcode
having sum(exit) = 0
) as present
from sessions s;
解决方案
如果我得到您想要做的正确的事情,您可以添加另一个外部聚合。
...
(SELECT sum(x.count)
FROM (SELECT count(*) count
FROM barcodes b
WHERE b.session_id = s.id
GROUP BY b.session_id,
b.barcode
HAVING sum(b.enter) <> 0
AND sum(b.exit) = 0) x) present
...
但我认为有一种更简单的方法来获得你想要的东西,只需为会话取enter
减的总和。exit
由于任何带有exit = 1
也带有的行enter = 1
,我们需要将exit
之前的减法加倍。
...
(SELECT sum(b.enter - 2 * b.exit)
FROM barcodes b
WHERE b.session_id = s.id) present
...
推荐阅读
- python - Scikit-learn:在超参数调整后对整个数据集使用交叉验证
- php - 按 ID 过滤 XML 文件
- ios - JSON 有问题 - 数据重复
- objective-c - 在 Objective-C 生成的代码中 Protobuf 缺少“列表”后缀
- twilio - Twilio 合并子录音
- javascript - 如何正确递归地遍历磁盘目录并使用node.js将所有相对格式的路径流式传输到json中?
- javascript - 使用 reducer 更新 Redux 中的特定状态
- javascript - 考虑到动态内容高度,使用 vue 过渡平滑展开/折叠过渡
- node.js - 找不到ffprobe?
- iis - Shibboleth SP3 HTTP 标头丢失