Mysql 分组依据,但忽略空值,除非没有空值
(为了便于解释,我正在简化我的数据) 我有一个非规范化的表(基本上是3个不同表之间连接的结果),如下所示:Mysql 分组依据,但忽略空值,除非没有空值,mysql,sql,Mysql,Sql,(为了便于解释,我正在简化我的数据) 我有一个非规范化的表(基本上是3个不同表之间连接的结果),如下所示: driver_uuid | vehicle_uuid | document_uuid 一个司机有很多车, 驱动程序有许多文档, 一辆车有很多文件 我想运行一个查询,其中每个唯一的驾驶员/车辆对都有一行 我试着去做 SELECT * FROM driver_vehicle_documents GROUP BY driver_uuid, vehicle_uuid 这几乎奏效,但有一个问题
driver_uuid | vehicle_uuid | document_uuid
一个司机有很多车,驱动程序有许多文档,
一辆车有很多文件 我想运行一个查询,其中每个唯一的驾驶员/车辆对都有一行 我试着去做
SELECT * FROM driver_vehicle_documents
GROUP BY
driver_uuid,
vehicle_uuid
这几乎奏效,但有一个问题:
拥有1辆或更多车辆的驾驶员将比他们拥有的车辆数量多出现一次。i、 e.拥有1辆车的驾驶员将出现两次:一次用于驾驶员/车辆对,一次用于驾驶员/零对
我们想让一个拥有0辆车的司机出现一次。一名驾驶1辆车的驾驶员将出现一次,一名驾驶2辆车的驾驶员将出现两次,以此类推
我知道表格的设计对于这个问题来说并不理想,但是表格用于许多不同的目的,并且在设计时考虑了这些因素。此时更改其设计是不可行的。似乎相当直截了当:过滤掉
null
值,不包括第三列
看起来很直截了当:过滤掉空值,不包括第三列
SELECT driver_uuid, 0
FROM driver_vehicle_documents
WHERE vehicle_uuid is null
GROUP BY
driver_uuid,
vehicle_uuid
UNION ALL
SELECT driver_uuid, vehicle_uuid
FROM driver_vehicle_documents
WHERE vehicle_uuid is not null
GROUP BY
driver_uuid,
vehicle_uuid
似乎很直截了当:过滤掉
null
值,不包括第三列
看起来很直截了当:过滤掉空值,不包括第三列
SELECT driver_uuid, 0
FROM driver_vehicle_documents
WHERE vehicle_uuid is null
GROUP BY
driver_uuid,
vehicle_uuid
UNION ALL
SELECT driver_uuid, vehicle_uuid
FROM driver_vehicle_documents
WHERE vehicle_uuid is not null
GROUP BY
driver_uuid,
vehicle_uuid
另一种方法是分别处理
NULL
值。因此,基本上运行查询筛选出NULL
值,然后添加回您想要的值:
SELECT DISTINCT driver_uuid, vehicle_uuid
FROM driver_vehicle_documents
WHERE vehicle_uuid
UNION ALL
SELECT DISTINCT driver_uuid, NULL
FROM driver_vehicle_documents dvd
WHERE NOT EXISTS (SELECT 1
FROM driver_vehicle_documents dvd2
WHERE dvd2.driver_uuid = dvd.driver_uuid AND
dvd2.vehicle_uuid IS NOT NULL
);
另一种方法是分别处理
NULL
值。因此,基本上运行查询筛选出NULL
值,然后添加回您想要的值:
SELECT DISTINCT driver_uuid, vehicle_uuid
FROM driver_vehicle_documents
WHERE vehicle_uuid
UNION ALL
SELECT DISTINCT driver_uuid, NULL
FROM driver_vehicle_documents dvd
WHERE NOT EXISTS (SELECT 1
FROM driver_vehicle_documents dvd2
WHERE dvd2.driver_uuid = dvd.driver_uuid AND
dvd2.vehicle_uuid IS NOT NULL
);
假设您有两个列表;司机名单和车辆名单 您需要完整的驾驶员列表,以及任何车辆记录(如果存在) 您可以通过自外部联接来实现这一点,如下所示:
SELECT drivers.driver_uuid,
vehicles.vehicle_uuid,
vehicles.document_uuid
FROM driver_vehicle_documents drivers
LEFT JOIN driver_vehicle_documents vehicles ON vehicles.driver_uuid = drivers.driver_uuid
AND vehicles.vehicle_uuid IS NOT NULL
连接只允许有车辆ID的记录。但如果没有找到,驾驶员记录仍将输出(因为它是外部连接),车辆和文档ID将返回为空。假设您有两个列表;司机名单和车辆名单 您需要完整的驾驶员列表,以及任何车辆记录(如果存在) 您可以通过自外部联接来实现这一点,如下所示:
SELECT drivers.driver_uuid,
vehicles.vehicle_uuid,
vehicles.document_uuid
FROM driver_vehicle_documents drivers
LEFT JOIN driver_vehicle_documents vehicles ON vehicles.driver_uuid = drivers.driver_uuid
AND vehicles.vehicle_uuid IS NOT NULL
连接只允许有车辆ID的记录。但如果没有找到,驾驶员记录仍将输出(因为它是外部连接),车辆和文档ID将返回为空。这有效!对它进行了一点修改,以适合我们表的实际实现,它工作起来非常有魅力。谢谢你的帮助!这是一个奇迹(我不确定)!这成功了!对它进行了一点修改,以适合我们表的实际实现,它工作起来非常有魅力。谢谢你的帮助!这是一个奇迹(我不确定)!