MYSQL-SELECT NULL,否则每个组的最新日期

时间:2019-05-08 10:08:23

标签: mysql sql

我的数据库中有以下数据:

| ID   | FK_ID  | MODEL | DATE              | 
+------+--------+-------+-------------------+
|1     | 11     | m1    |NULL               |
|2     | 11     | m1    |NULL               |
|3     | 11     | m2    |2019-05-08 12:04:24|
|4     | 11     | m2    |2019-05-08 12:07:43|
|5     | 11     | m2    |2019-05-08 12:08:37|
|6     | 11     | m3    |2019-05-08 12:13:19|
|7     | 11     | m3    |NULL               |
|8     | 12     | m7    |2019-05-08 12:04:14|

我想获取每个MODEL的最新日期,但是如果某个MODEL的DATE为空,那么我想获取NULL而不是最新日期。

预期产量

| MODEL | DATE              |
+-------+-------------------+
| m1    |NULL               |
| m2    |2019-05-08 12:08:37|
| m3    |NULL               |

我尝试了以下查询:

SELECT MODEL, DATE FROM MODEL_TABLE
WHERE FK_ID = 11 AND (DATE IN ( 
    SELECT MAX(DATE)
    FROM MODEL_TABLE
    GROUP BY MODEL
) OR DATE IS NULL)
GROUP BY MODEL;

但是我得到以下结果:

实际输出(错误)

| MODEL | DATE              |
+-------+-------------------+
| m1    |NULL               |
| m2    |2019-05-08 12:08:37|
| m3    |2019-05-08 12:13:19|

有人可以让我知道如何更正查询以获取预期结果

2 个答案:

答案 0 :(得分:2)

count(*)计数所有行,count(date)计数非空值。如果它们相同,则不存在null,即返回max(date),否则返回null。

SELECT MODEL, case when count(*) = count(DATE) then max(DATE) end
FROM MODEL_TABLE
group by MODEL

答案 1 :(得分:2)

您可以使用条件聚合:

AND

您可以用其他方式写条件。对于您正在做的事情,这似乎更直观:

OR