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。不,除非你真的打算进行内部连接。谢谢,我是通过谷歌搜索得到的: