2013-03-02 74 views
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中沒有以前記錄的用戶的記錄。我試圖用不在運算符中編寫查詢,但我不知道如何給日期少於當前記錄日期的參數。

[編輯]

這是我達到了我所在的地方卡住了。

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最小記錄?

+3

[你有什麼嘗試?](http://whathaveyoutried.com) – 2013-03-02 04:40:02

+0

說實話,試圖搜索谷歌正確的方式這樣做。嘗試了其他方式來實現我的目標,即生成報告。當我無法弄清楚查詢的結構和其他實現目標的方法時,我在這裏問了一個問題。 – Sourabh 2013-03-02 04:45:37

+0

你是否嘗試寫一些SQL? – 2013-03-02 04:46:09

回答

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

+0

否這不起作用,因爲最內層的查詢正在返回所有行,其中日期小於時間框架的最後一個日期,這使得外層查詢不會選擇除最後日期外的任何行。 :( – Sourabh 2013-03-02 05:59:56

+0

不是最後一個,但是第一個。看到sqlfiddle提供。 – peterm 2013-03-02 06:02:32

+0

@Sourabh看到更新的答案澄清。 – peterm 2013-03-02 06:07:25

相關問題