mysql - 将不存在的右表值返回为 NULL
问题描述
我有两个 MySQL 表:
CREATE TABLE things (
id INT
);
CREATE TABLE properties (
thing_id INT,
name VARCHAR(100),
value VARCHAR(100)
);
INSERT INTO things (id) VALUES (1);
INSERT INTO properties (thing_id, name, value) VALUES
(1, 'name', 'John'),
(1, 'age', '123');
我希望能够thing
根据其名称为 a 选择属性,并NULL
在此类属性不存在时返回。这是我尝试过的:
SELECT
p1.value AS name,
p2.value AS age,
p3.value AS foo
FROM
things AS t
LEFT JOIN properties AS p1 ON t.id = p1.thing_id
LEFT JOIN properties AS p2 ON t.id = p2.thing_id
LEFT JOIN properties AS p3 ON t.id = p3.thing_id
WHERE
t.id = 1
AND p1.name = 'name'
AND p2.name = 'age'
AND p3.name = 'foo';
我希望结果是
name | age | foo
---------------------
'John' | '123' | NULL
但不幸的是,这个查询返回一个空的结果集,因为我认为这样的结果集p3
不存在。
我怎样才能写一个查询来做我想做的事?(最好不要使用显式LEFT JOIN
s 而是逗号和WHERE
条件,因为这是一个以编程方式生成的 SQL 查询。)感谢您的任何建议。
解决方案
您需要将WHERE
条件移到p1
, p2
和p3
它们各自的JOIN
条件中,否则会将这些LEFT JOIN
s 变成INNER JOIN
s (请参阅手册)。
SELECT
p1.value AS name,
p2.value AS age,
p3.value AS foo
FROM
things AS t
LEFT JOIN properties AS p1 ON t.id = p1.thing_id AND p1.name = 'name'
LEFT JOIN properties AS p2 ON t.id = p2.thing_id AND p2.name = 'age'
LEFT JOIN properties AS p3 ON t.id = p3.thing_id AND p3.name = 'foo'
WHERE
t.id = 1
推荐阅读
- react-native - 滑动到列表末尾时不调用 FlatList `onEndReached` 回调
- php - 检查用户出生日期为 18 岁或以上的功能并不总是正常工作
- ruby-on-rails - 当我运行完整的 rspec 测试套件时,Spring 是否可以工作?
- python - 即使我不按侧键,我的宇宙飞船也会继续移动
- wix - WiX 捆绑包在同一版本的 ARP 中创建多个条目
- vue.js - nuxt 匿名中间件,如何在组件上设置数据
- reactjs - 尝试访问 JWT Authenticated Users 内容在 laravel 中给出 401
- django - 如何以角度将json api数据加载到html模板?
- r - nls 缺失值或无穷大产生
- dashboard - 使用 dcc.Dropdown 过滤 pandas df 并在前端显示结果