MySQL留下了连接变体 - 即使在丢失的行上也是如此

时间:2014-10-13 17:28:04

标签: mysql sql join left-join

我已经可以弄清楚如何连接并从主表中选择行,即使辅助表没有匹配的行也是如此。我想要的是有点不同。

Table A:  id, pid
Table B:  id, pid, uid, aid

我想要的是表A中的所有pids,对于给定的aid

,匹配uid(如果存在)

即,如果示例数据为:

表A:

1,  p1
2,  p2
3,  p3

表B:

1, p1,  u1,   abcd
2, p1,  u2,   pqrs
3, p2,  u1,   wxyz

我想选择:

p1,   abcd
p2,   wxyz
p3,   NULL

u1的所有条目,如果没有条目,则使用aid = NULL。

基本上,我试过了:

SELECT A.* FROM A LEFT JOIN B ON A.pid=B.pid WHERE uid='u1'

它不起作用(我明白为什么它不会)。

2 个答案:

答案 0 :(得分:4)

您可以使用left join执行此操作,但需要将b.uid上的条件从on子句移至where子句:

select a.id, a.pid, b.aid
from a left join
     b
     on a.pid = b.pid and b.uid = 1;

答案 1 :(得分:0)

以下查询应解决您的问题

SELECT A.pid, aid
FROM A LEFT JOIN B
ON A.pid = B.pid and B.uid = "u1";

<强>输出 http://sqlfiddle.com/#!2/5eaa05/10

您的查询

SELECT A.* 
FROM A LEFT JOIN B 
ON A.pid=B.pid 
WHERE uid='u1'

<强>输出 http://sqlfiddle.com/#!2/5eaa05/12

问题在于WHERELEFT JOIN用作INNER JOIN