通过不显示空值进行分组

时间:2016-06-10 15:22:49

标签: mysql group-by

编辑: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?

2 个答案:

答案 0 :(得分:1)

使用null-safe equal运算符,以便将NULLNULL进行比较。

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

答案 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;