mysql - 如果外键列具有 NULL 值,MySQL 不选择行
问题描述
以下 SQL 有效,但如果一行具有transfers.driver
as NULL
,则不会选择该行。一旦我为该行添加了一个值,driver
就会被选中。即使driver
是,我如何选择行NULL
?
SELECT
transfers.id,
transfers.name AS name,
transfers.pickup_time AS pickup_time,
transfers.voucher AS voucher,
transfer_types.name AS type,
drivers.name AS driver
FROM
transfers
INNER JOIN transfer_types ON transfer_types.id = transfers.type
INNER JOIN drivers ON drivers.id = transfers.driver
这是表的结构:
CREATE TABLE `transfers` (
`id` int(10) UNSIGNED NOT NULL,
`voucher` varchar(24) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`type` int(10) UNSIGNED DEFAULT NULL,
`pickup_time` time DEFAULT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`driver` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这是外键:
ALTER TABLE `transfers`
ADD CONSTRAINT `transfers_driver_foreign`
FOREIGN KEY (`driver`) REFERENCES `drivers` (`id`),
ADD CONSTRAINT `transfers_type_foreign`
FOREIGN KEY (`type`) REFERENCES `transfer_types` (`id`);
解决方案
使用left join
而不是inner join
:
SELECT
transfers.id,
transfers.name AS name,
transfers.pickup_time AS pickup_time,
transfers.voucher AS voucher,
transfer_types.name AS type,
drivers.name AS driver
FROM
transfers
LEFT JOIN transfer_types ON transfer_types.id = transfers.type
LEFT JOIN drivers ON drivers.id = transfers.driver
推荐阅读
- reactjs - 如何使用 formik 和 typescript、钩子构建自定义 onSubmit 函数
- vue.js - Vue构建后第一次加载耗时5分钟以上
- spring-boot - Spring-batch 未从 setTablePrefix 获取表前缀
- javascript - 如何使用环境变量在 Nuxt 中动态导入 SCSS 样式表
- oracle - 如何仅使用 Oracle 工具将数据库(或仅表)从 PostgreSQL 迁移(转换)到 Oracle?
- hp-uft - 我需要在 UFT One 中添加哪些插件,以便框架类应为 SAPFrame?
- swiftui - 在 SwiftUI 中从左到右排列 HStack 中的项目
- mysql - 获取包含一对多的行。但不是另一个
- python - JSONDecodeError Django Javascript JSON
- angular - NgRx 在调度动作后执行动作(异步)