Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 分组依据,但忽略空值,除非没有空值_Mysql_Sql - Fatal编程技术网

Mysql 分组依据,但忽略空值,除非没有空值

Mysql 分组依据,但忽略空值,除非没有空值,mysql,sql,Mysql,Sql,(为了便于解释,我正在简化我的数据) 我有一个非规范化的表(基本上是3个不同表之间连接的结果),如下所示: driver_uuid | vehicle_uuid | document_uuid 一个司机有很多车, 驱动程序有许多文档, 一辆车有很多文件 我想运行一个查询,其中每个唯一的驾驶员/车辆对都有一行 我试着去做 SELECT * FROM driver_vehicle_documents GROUP BY driver_uuid, vehicle_uuid 这几乎奏效,但有一个问题

(为了便于解释,我正在简化我的数据)

我有一个非规范化的表(基本上是3个不同表之间连接的结果),如下所示:

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将返回为空。

这有效!对它进行了一点修改,以适合我们表的实际实现,它工作起来非常有魅力。谢谢你的帮助!这是一个奇迹(我不确定)!这成功了!对它进行了一点修改,以适合我们表的实际实现,它工作起来非常有魅力。谢谢你的帮助!这是一个奇迹(我不确定)!