编辑: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,它起作用了:
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
如何让第3位用户完成null?
答案 0 :(得分: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;
答案 1 :(得分:-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;