我有一个非定期的艺术课程。 每天我都会在表格中添加一个新的“礼物”条目。
我想知道错过最近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
答案 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