假设我们有一个类,对于这个类,每个学生都可以多次进入和退出,而我将它们存储在数据库中(每次输入和每次进入课堂后退出),例如:
`id`, `student_id`, `session_id`, `enter`, `exit`, `date_time`
'1', '123', '1', '1', '0', '---', #enter
'1', '123', '1', '1', '1', '---', #exit有123 id的学生输入到类,即1输入到类中,而我通过enter = 1 and exit = 0创建行
退出课堂后,我又有了一个新行,名为enter = 1 and exit = 1。
我应该拥有这个结构,不能在一行中更改它们,这意味着我不能更新现有的行。现在,这个学生可以在存储输入数据后多次进入课堂并退出,
实际上,这个学生只是一个进入课堂并退出指定类的人,session_id = 1,现在我如何计算这个操作并从数据库中获取?我不需要计算学生在课堂上的表现,我只需要把多次进入课堂的所有学生计数为一次记录。
DB-FILLDLE示例sql
发布于 2019-08-07 07:53:58
我认为您可以使用条件聚合来实现您想要的结果,将enter = 1和exit = 0作为登录的情况之和,以及enter = 1和exit = 1作为注销的情况之和。还可以通过将查询写入JOIN来简化查询。
select s.id, s.session_name, s.session_type, s.date_time,
sum(case when b.enter = '1' and b.exit = '0' then 1 else 0 end) as logins,
sum(case when b.enter = '1' and b.exit = '1' then 1 else 0 end) as logouts,
sum(case when b.enter = '1' and b.exit = '0' then 1 else 0 end) - sum(case when b.enter = '1' and b.exit = '1' then 1 else 0 end) as person
from sessions s
left join barcodes b on b.session_id = s.id
group by s.id输出:
id session_name session_type date_time logins logouts person
1 class_a 1 --- 4 2 2
2 class_b 2 --- 2 0 2如果您只想要每个会话的学生人数(登录或退出),则可以计算该会话的不同条形码:
select s.id, s.session_name, s.session_type, s.date_time,
count(distinct b.barcode) as person
from sessions s
left join barcodes b on b.session_id = s.id
group by s.id输出:
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1https://stackoverflow.com/questions/57389244
复制相似问题