MySQL从多个表中选择WHERE compare为NULL,给出前一行的值

时间:2015-11-06 19:26:38

标签: mysql select null

我试图获取表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中 - 或者我只是过于转储:(< / p>

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)

3 个答案:

答案 0 :(得分:0)

始终使用显式JOIN语法。首先,您将了解LEFT JOIN,这是您想要的:

SELECT B.ID, A.Name
FROM B LEFT JOIN
     A 
     ON B.A_ID = A.ID 
ORDER BY B.ID ASC;

答案 1 :(得分:0)

看起来LEFT JOIN就是你想要的

 SELECT 
  B.ID, 
  A.NAME /* Will be null if A record doesn't exist */
 FROM B 
 LEFT JOIN A ON B.A_ID = A.ID
 ORDER BY B.ID ASC

答案 2 :(得分:0)

如果你不想在前面的表中找到所有匹配项,那么你使用左连接,那么你没有指定你想在where中找到空值,因为那样只能找到空值。

SELECT B.ID, A.Name FROM A
LEFT JOIN B 
ON B.A_ID = A.ID 
ORDER BY B.ID ASC