2016-06-10 90 views
0

編輯:DEMO集團通過不顯示空值

這裏是我的表差事:

user_id | date  | hour | done 
1  | 2016-01-01 | 08:00 | 08:03:07 
1  | 2016-01-01 | 09:00 | 09:05:07 
2  | 2016-01-01 | 11:00 | 11:07:05 
2  | 2016-01-01 | 11:10 | 11:18:01 
3  | 2016-01-01 | 9:00 | null 
3  | 2016-01-01 | 10:00 | null 
3  | 2016-01-01 | 10:05 | null 

我想每個用戶的最後使命:

user_id | date  | hour | done 
1  | 2016-01-01 | 09:00 | 09:05:07 
2  | 2016-01-01 | 11:10 | 11:18:05 
3  | 2016-01-01 | 10:05 | null 

所以我有使用GROUP BY like和它的工作原理:

SELECT user_id, MAX(done) done FROM errand WHERE done = '2016-06-01' GROUP BY user_id; 

它顯示我:

user_id | done 
1  | 09:05:07 
2  | 11:18:05 
3  | null 

但是,問題是,我不能在SELECT將它顯示時間和日期,因爲我得到這個(錯誤代碼:1055#表達SELECT列表的1不在GROUP BY子句中,並且包含非聚集列......它在功能上不依賴於GROUP BY子句中的列;這與sql_mode = only_full_group_by不兼容)。

所以,我想這一點:

SELECT * FROM errand e JOIN (
    SELECT user_id u, MAX(done) d 
    FROM errand WHERE date = '2016-06-01' 
    GROUP BY user_id 
) x on x.a = e.user_id AND x.b = e.done; 

但它只能說明我在哪裏,做行不爲空:

user_id | date  | hour | done 
1  | 2016-01-01 | 09:00 | 09:05:07 
2  | 2016-01-01 | 11:10 | 11:18:05 

我該怎麼做才能讓地方做的第三個用戶爲空?

+0

我倒是店裏的日期和時間爲一個單一的實體。我會把'done'存儲爲TIMESTAMP。 – Strawberry

回答

1

使用null-safe equal操作使之與NULL比較NULL將匹配。

SELECT e.* FROM errand e JOIN (
    SELECT user_id u, MAX(done) d 
    FROM errand WHERE date = '2016-06-01' 
    GROUP BY user_id 
) x on x.u = e.user_id AND x.d <=> e.done; 

DEMO

+0

它將表格中的每一行都返回給我。當我把'='我得到2個結果,但'<=>'更多 –

+0

我已經添加了一個sqlfiddle演示顯示它的工作原理。 – Barmar

+0

奇怪的是,因爲在我的MySQL上,我得到了這個:http://image.noelshack.com/fichiers/2016/23/1465575944-005.png:你有一個想法,爲什麼結果是不同的? –

-1

這應該工作:

SELECT * FROM (
    SELECT user_id u, MAX(done) d 
    FROM errand WHERE date = '2016-01-01' 
    GROUP BY user_id 
) x 
LEFT OUTER JOIN errand e on x.u = e.user_id AND x.d = e.done; 
+0

我收到了:錯誤代碼:1054.'on子句'中的未知列'e.user_id' –

+0

GROUP BY courier_id - 它是否存在列?我將其更改爲user_id,並更改了ON子句中的別名。它仍然給出一個錯誤? – amaksr

+0

對不起這是一個錯誤,它是user_id列而不是courier_id –