我有一张名为student的表,结构如下。该表代表学生访问图书馆。
Id Name Date StudentId 1 John 2010-01-09 3 2 Matt 2010-01-10 5 3 Jane 2010-02-10 8 4 John 2010-02-10 3 5 Matt 2010-02-11 5 6 Jane 2010-02-11 8 7 Bob 2010-02-12 9 8 Tom 2010-02-12 10 9 Sam 2010-02-12 11 10 Jane 2010-02-12 8
我每天都在运行查询来获取新访问者。新访问者是在该日期之前从未访问过该库的访问者。我使用的查询如下。
SELECT count(*) FROM student
WHERE DATE(Date) = :date
AND Name NOT IN
(SELECT DISTINCT Name FROM student WHERE DATE(Date) < :date);
我目前在我的程序中迭代表中的每个日期,然后使用上面的查询每天为我提供新访问者。这工作正常但是想知道是否可以在单个查询中获取所有值而无需在程序中迭代?什么更优化?
我期待的输出如下:
Date Count of New Visitors 2010-01-09 1 2010-01-10 2 2010-01-11 0 2010-01-12 3
请注意,我尝试过的以下查询无法获取正确的结果
SELECT Date, Count(*) FROM student
WHERE DATE(Date) BETWEEN :startdate AND :enddate
AND Name NOT IN
(SELECT DISTINCT Name FROM student WHERE DATE(Date) < :startdate) GROUP BY Date;
结果(这是不正确的以及我不想要的)我将从上面的查询获得startdate = 2010-01-09和enddate = 2010-01-12如下:
Date Count of New Visitors 2010-01-09 1 2010-01-10 3 2010-01-11 2 2010-01-12 4
答案 0 :(得分:1)
您的测试输出中有错误。我认为这就是你要找的东西:
select u1.date,
(select count(*)
from users u2
where u2.date = u1.date
and u2.studentid not in(select studentid from users u3 where u3.date < u2.date)) c
from users u1
group by u1.date