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

これは、正確な日付が 1 つだけの場合にうまく機能します。しかし、たとえば 1 か月という時間枠になると、日付がその特定のユーザーの記録日である内部クエリを取得する方法がわかりません。

[編集]

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 の最小レコードを表示するにはどうすればよいですか?

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 に答える