我的桌面设计有点像这样。
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的最小记录?
答案 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