我正在尝试获取表 B 的所有行的列表,以及表 A 中的匹配名称(如果给出)。但我的结果不符合预期:/
如果你能帮忙就太好了:)
这是(精简的)代码:
表A:
ID | Name | …
1 | foo | …
2 | bar | …
3 | baz | …
表B:
ID | A_ID | …
1 | 1 | …
2 | 3 | …
3 | 2 | …
4 | 1 | …
5 | NULL | …
我的查询:
SELECT B.ID, A.Name FROM A, B WHERE B.A_ID = A.ID OR B.A_ID IS NULL ORDER BY B.ID ASC
我想要的输出是这样的:
1 | foo
2 | baz
3 | bar
4 | foo
5 | NULL or ''
但事实是:
1 | foo
2 | baz
3 | bar
4 | foo
5 | foo <-- huh?
非常感谢!
编辑:好的,LEFT JOIN 适用于简单的设置,但在我的实际查询中,我从 5 个表中获取内容,看起来我无法将 2 个表传递到 JOIN 中 - 或者我只是太转储了:(
SELECT
c.name as c_name,
a.name as a_name,
p.name as p_name,
e.memo
FROM
e, c, x, a, p
WHERE
e.id = x.e_id AND c.id = x.c_id
AND a.id = e.a_id
AND (p.id = e.p_id OR e.p_id IS NULL)
最佳答案
始终使用显式的JOIN
语法。一方面,您将了解 LEFT JOIN
,这正是您想要的:
SELECT B.ID, A.Name
FROM B LEFT JOIN
A
ON B.A_ID = A.ID
ORDER BY B.ID ASC;
关于MySQL 从多个表中选择 WHERE 比较为 NULL 给出前一行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574220/