在特定时间范围内获取新记录

时间:2013-03-02 04:38:40

标签: mysql sql

我的桌面设计有点像这样。

id |    date    | user_id
1  | 2013-02-02 |  1
2  | 2013-02-02 |  2
3  | 2013-02-02 |  5
4  | 2013-02-03 |  6
5  | 2013-02-03 |  7
6  | 2013-02-03 |  1

现在我想为特定日期或时间范围的新用户选择记录。例如,如果我选择date=date('2013-02-03'),我只需要新用户的记录,即记录ID 4和5,并且不应该返回6,因为用户已经有记录。

简单地说,它应该只返回其user_id上没有先前记录的用户记录。我尝试不在运算符中编写查询,但我不知道如何为日期少于当前记录日期的参数。

[编辑]

这是我到达的地方,也是我被困的地方。

select id from mytable where date=date('2013-02-03') and user_id not in (select user_id from mytable where date<date('2013-02-03'))

只有一个确切的日期才能正常工作。但是当谈到时间框架时,比如一个月,我无法弄清楚如何获得内部查询,其中日期应该是该特定用户的记录日期。

[编辑]

使用having子句尝试此查询。它返回空的结果。

select id, date, user_id from mytable having min(date(date))>=date("2013-01-02") and min(date(date))<=date("2013-02-02")

好吧我遇到了这个查询的问题。它的检查时间(日期)超过所有记录。如何查找每个user_id的最小记录?

1 个答案:

答案 0 :(得分:2)

假设你有

+----+------------+---------+
| id | date       | user_id |
+----+------------+---------+
|  1 | 2013-02-02 |       1 |
|  2 | 2013-02-02 |       2 |
|  3 | 2013-02-02 |       5 |
|  4 | 2013-02-03 |       6 |
|  5 | 2013-02-03 |       7 |
|  6 | 2013-02-03 |       1 |
|  7 | 2013-02-04 |       6 | <-- additional record for user_id 6
+----+------------+---------+

您正试图在区间2013-02-03 - 2013-02-04

中吸引新用户
SELECT MIN(id) id, MIN(`date`) `date`, `user_id`
  FROM (
SELECT * 
  FROM mytable
 WHERE `date` BETWEEN DATE('2013-02-03') AND DATE('2013-02-04')
   AND user_id NOT IN (SELECT DISTINCT user_id 
                         FROM mytable 
                        WHERE `date` < DATE('2013-02-03'))
       ) t
 GROUP BY user_id

这将是你的输出:

+------+------------+---------+
| id   | date       | user_id |
+------+------------+---------+
|    4 | 2013-02-03 |       6 |
|    5 | 2013-02-03 |       7 |
+------+------------+---------+

这是 sqlfiddle