SQL如何根据条件计算每个id的最后条目

时间:2016-02-19 01:49:11

标签: mysql sql nested

我有一个非定期的艺术课程。 每天我都会在表格中添加一个新的“礼物”条目。

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

  

重要的是,每个学生都选择不同的工作日来上课。其中一些是每周2天。

我有2个表,学生在线状态

礼物是一个3列表:student_id,day,present。

我会得到一个查询,突出显示所有错过最近2天的学生。

这会返回一个包含3列的表:Student_Id,Name如果错过了最后两天,我怎么能得到这个结果?

表格结构是

  • 学生 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

在这种情况下,鲍勃错过了最后一天,卡罗尔错过了最近2天。预期的结果将是:

student_id  name   misses_two_last_days 
----------------------------------------
1           Bob     FALSE
2           Carol   TRUE

4 个答案:

答案 0 :(得分:1)

您的查询存在很多问题。尝试重写它以使用joins。您还必须定义最近2天。我尝试用下面的subquery做到这一点。然后,您需要使用aggregation来查看学生是否错过了这两天。这是应该接近的事情:

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子句并替换为{ {1}}陈述:

case

答案 1 :(得分:0)

另一个带有一个subuqery的解决方案。请检查它是否符合您的要求。

SELECT 
    s.id, 
    s.name,
    ( SELECT SUM(p.present = false)
      FROM p
      WHERE p.student_id = s.id 
      ORDER BY p.day DESC
      LIMIT 2 ) AS misses_two_last_days
FROM s;

答案 2 :(得分:0)

现在因为你只提供了这么少的信息,我可以告诉你的是你的子查询有什么问题:

SELECT COUNT(*) FROM 
(SELECT p.student_id 
       FROM p WHERE p.student_id = s.id  ORDER BY p.day DESC LIMIT 2) AS subquery
WHERE p.present = false

让我们检查一下,您将表重命名为子查询,但您的位置仍在使用 p.present ,这就是您收到错误的原因。数据库无法获得 p 。你的查询有点悲惨,如果你能说清楚,我会尽力帮你搞定

答案 3 :(得分:-1)

您必须为查询中使用的表定义别名。

例如:

SELECT s.id, s.name, p.day FROM 
Students s, Presences p 
WHERE s.id = p.student_id