1

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

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 上没有以前记录的用户的记录。我尝试使用 not in 运算符编写查询,但我不知道如何为日期提供小于当前记录日期的参数。

[编辑]

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

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'))

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

[编辑]

使用 having 子句尝试了这个查询。它返回空结果。

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

好的,我遇到了这个查询的问题。它检查所有记录中的 min(date)。我怎样才能让这个查找每个 user_id 的最小记录?

4

1 回答 1

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

于 2013-03-02T05:49:39.010 回答