mysql - 通过不显示空值进行分组

标签 mysql group-by

编辑: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运算符,以便将 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

关于mysql - 通过不显示空值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751850/

相关文章:

MySQL优化可以解决吗?

sql - 对于连接表中所有缺失的组合返回 0

python - 将重复行添加到 DataFrame

Python:识别列中的连续零,删除它们的行并开始新的编号

mysql - 通过批处理文件连接到 MySQL

mysql - 替换mysql查询中的文本

php - 如何在 PHP PDO for MySQL 中使用 VARBINARY 准备语句?

mysql - 选择具有最大值的行数

ruby-on-rails - 按日期范围对记录进行分组并在 Rails 中对其进行计数

MySql、LOAD DATA 或 BATCH INSERT 或任何其他更好的批量插入方式