编辑:DEMO
这是我的餐 table 任务:
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;
但它只显示done不为空的行:
user_id | date | hour | done
1 | 2016-01-01 | 09:00 | 09:05:07
2 | 2016-01-01 | 11:10 | 11:18:05
如何让第三个用户的 did 为空?
最佳答案
使用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;
关于mysql - 通过不显示空值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751850/