SQL:从mysql中按日期提取新数据,而不在程序

时间:2015-05-16 06:21:24

标签: mysql

我有一张名为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

1 个答案:

答案 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