MySQL:JOIN 查询获取所有具有可为空字段的项目

标签 mysql sql select join null

我有一个item 表,它有一个指向tax 表的外键引用。该列是 tax_id

我曾经在我的架构中将 tax_id 作为 NOT NULL,但是我只是更改了它,因为我希望它是可选的,所以现在它是 架构中的 NULL DEFAULT NULL

这打破了我的查询。现在,当我查询项目并加入税收时,我只会得到 tax_id 字段匹配的项目。

这是我的查询:

SELECT item.*
FROM item
JOIN user_item
    ON user_item.item_id = item.id
JOIN tax
    ON tax.id = item.tax_id
WHERE user_item.user_id = ?
    AND item.deleted_at IS NULL
    AND user_item.deleted_at IS NULL
    AND tax.deleted_at IS NULL

这个查询有效,但是如果我得到以下项目:

+----+--------+--------------------+-------------+-------+---------------------+------------+------------+
| id | tax_id | name               | description | price | created_at          | updated_at | deleted_at |
+----+--------+--------------------+-------------+-------+---------------------+------------+------------+
|  1 |      2 | foo                |             |  1.13 | 2017-07-30 15:20:14 | NULL       | NULL       |
|  2 |   NULL | bar                |             |  0.67 | 2017-07-30 15:20:25 | NULL       | NULL       |
|  3 |   NULL | baz                |             |  1.15 | 2017-07-30 15:22:33 | NULL       | NULL       |
+----+--------+--------------------+-------------+-------+---------------------+------------+------------+

然后查询只返回 id 为 1 的项目。我也想要 id 2 和 3。

如何修改我的查询以实现此目的?

我理解查询的问题是这部分:ON tax.id = item.tax_id

最佳答案

这正是 left join 的用途:

SELECT item.*
FROM item
JOIN user_item
    ON user_item.item_id = item.id
LEFT JOIN tax -- Here!
    ON tax.id = item.tax_id
WHERE user_item.user_id = ?
    AND item.deleted_at IS NULL
    AND user_item.deleted_at IS NULL
    AND tax.deleted_at IS NULL

关于MySQL:JOIN 查询获取所有具有可为空字段的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45401644/

相关文章:

MySQL 5.7 alter table DDL 语句锁定,但应允许并发 DML

MySQL INSERT INTO ... SELECT 或默认值

sql - 选择查询根据优先级选择

MYSQL:从多个值与单个列匹配至少两次的表中选择 id

mysql - 子查询的子查询的 where 子句中的未知列

java - if语句中的代码突然离开

sql - 外键引用 PostgreSQL 中的其他外键

Mysql错误不遵循where条件

php - 即使使用 DISTINCT,SQL SELECT 查询也会回显两次

php - 如何查询开始日/月和结束日/月之间的价格