我有一个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/