MySQL左连接变体-即使在缺少行的情况下也进行选择

MySQL左连接变体-即使在缺少行的情况下也进行选择,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我已经知道如何从主表中联接和选择行,即使辅助表中并没有匹配的行。我想要的是有点不同 Table A: id, pid Table B: id, pid, uid, aid 我想要的是表A中的所有PID,以及给定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

我已经知道如何从主表中联接和选择行,即使辅助表中并没有匹配的行。我想要的是有点不同

Table A:  id, pid
Table B:  id, pid, uid, aid
我想要的是表A中的所有PID,以及给定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'

而且它不起作用,我理解为什么它不起作用。

下面的查询应该可以解决您的问题

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

你的问题

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


问题在于,左联接在何处作为内部联接工作

下面的查询应该可以解决您的问题

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

你的问题

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

问题在于,左联接在何处作为内部联接工作

您可以使用左连接来执行此操作,但需要将b.uid上的条件从where子句移动到on子句:

您可以使用左连接执行此操作,但需要将b.uid上的条件从where子句移动到on子句:



我不明白这和左连接有什么不同?为什么在您的示例中第一条记录总是1?在您的查询中,用AND替换where。当您将限制条件放在where子句中时,它本质上使其成为一个内部联接。将其移动到您的连接。哦正如@FuzzyTree所建议的:@FuzzyTree/paqogomez-是的,你说的很有效,我学到了一些新东西。如果你们中的任何一方/双方都可以添加此作为答案,我可以投票/接受:。谢谢大家!@WorkWise Gordon已经将其作为答案发布。如果你愿意,你可以接受他的回答我不明白这和左派有什么不同?为什么在您的示例中第一条记录总是1?在您的查询中,用AND替换where。当您将限制条件放在where子句中时,它本质上使其成为一个内部联接。将其移动到您的连接。哦正如@FuzzyTree所建议的:@FuzzyTree/paqogomez-是的,你说的很有效,我学到了一些新东西。如果你们中的任何一方/双方都可以添加此作为答案,我可以投票/接受:。谢谢大家!@WorkWise Gordon已经将其作为答案发布。如果你愿意,你可以接受他的回答。谢谢你的帮助。是的,这正是我正在做的,正如上面的评论所解释的,这在我的情况下不起作用。@WorkWise:如果可能,请发布一个SQLFIDLE以获取帮助。是的,这正是我所做的,正如上面的注释所解释的,这在我的情况下不起作用。@工作方式:如果可能,请发布一个SQLFIDLE为什么我们将b.uid从WHERE移到ON,这有什么区别?当WHERE子句中有条件时,它会将左连接变成一个内部连接,因此它会过滤第一个表中的行。在on子句中,这种情况不会发生。那么,当我们已经得到筛选结果时,WHERE with condition不是更好吗?@Rockse。不,除非你真的想要一个内部连接。谢谢,我是通过谷歌搜索得到的:为什么我们要将b.uid从WHERE移动到ON,这有什么区别?当条件在WHERE子句中时,它会将左连接变成一个内部连接,所以它会过滤第一个表中的行。在on子句中,这种情况不会发生。那么,当我们已经得到筛选结果时,WHERE with condition不是更好吗?@Rockse。不,除非你真的打算进行内部连接。谢谢,我是通过谷歌搜索得到的: