mysql - SQL如何根据条件计算每个ID的最后条目

标签 mysql sql nested

我有一个不定期的艺术类(class)。 每天我都会在表格中添加一个新的“礼物”条目。

我想知道最近 2 天错过的学生是什么。就在最近 2 天。

Important, each student choose a different weekday to have a class. and some of them 2 days per week.

我有 2 个表,StudentsPresences

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/

相关文章:

c - 嵌套结构的范围是什么?

mysql - SQL 查询错误 - 从带条件的表中选择

mysql - Laravel 一对多(逆)/属于返回 null

css - 多个css伪类

sql - 如何在 postgresql 中获取第二个最大日期

sql - 带聚合的硬查询

python - 递归搜索嵌套字典并将函数应用于搜索键 :value pair

java - MySQL JDBC 中的服务器端游标支持

php - Mysql select max 最大总和值

mysql - 创建存储过程 - MySQL