我有一个不定期的艺术类(class)。 每天我都会在表格中添加一个新的“礼物”条目。
我想知道最近 2 天错过的学生是什么。就在最近 2 天。
Important, each student choose a different weekday to have a class. and some of them 2 days per week.
我有 2 个表,Students 和 Presences。
presents 是一个包含 3 列的表:student_id、day、present。
我会得到一个查询,突出显示过去 2 天缺课的所有学生。
这将返回一个包含 3 列的表:Student_Id、姓名,如果错过了最后两天,我怎样才能得到这个结果?
表结构为
学生 id: int, name: varchar
存在 student_id: int, day: date, present: boolean
数据示例
presences students
student_id day present id name
--------------------------------- ------------
1 2016-01-01 0 1 'Bob'
1 2016-01-10 1 2 'Carol'
1 2016-01-20 0
2 2016-01-15 1
2 2016-01-27 0
2 2016-01-21 0
在这种情况下,Bob 只错过了最后一天,而 Carol 错过了最后 2 天。预期结果将是:
student_id name misses_two_last_days
----------------------------------------
1 Bob FALSE
2 Carol TRUE
最佳答案
您的查询有很多问题。尝试重写它以使用 joins
。您还必须定义最近 2 天。我试图用下面的 subquery
来做到这一点。然后您需要使用聚合
来查看学生是否错过了这两天。这是应该接近的东西:
select s.id, s.name
from students s
inner join presences p on s.id = p.student_id and p.present = false
inner join (select distinct day
from presences
order by day desc
limit 2) t on p.day = t.day
group by s.id, s.name
having count(p.day) = 2
重读你的问题,如果你想返回所有学生,而不仅仅是那些错过了最后 2 天的学生,你需要使用 outer joins
代替并删除 having
子句并替换为 case
语句:
select s.id, s.name,
case when count(p.day) = 2 then 'missed' else '' end as Missed
from students s
left join presences p on s.id = p.student_id and p.present = false
left join (select distinct day
from presences
order by day desc
limit 2) t on p.day = t.day
group by s.id, s.name
关于mysql - SQL如何根据条件计算每个ID的最后条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495912/