MySQL左连接,结果更少
我有一个小问题,我被困住了。我有两张桌子。第一个保存所有id,第二个保存表a中的一些(但不是全部)、值和相应的标识符。正如我所理解的,如果id在tableB中不存在,则id上的左连接应该为我提供第一个表中的所有id,第二个表为null。但我一直在获取两个表中存在的id数。我的概念错了吗 到目前为止,我的发言是:MySQL左连接,结果更少,mysql,join,Mysql,Join,我有一个小问题,我被困住了。我有两张桌子。第一个保存所有id,第二个保存表a中的一些(但不是全部)、值和相应的标识符。正如我所理解的,如果id在tableB中不存在,则id上的左连接应该为我提供第一个表中的所有id,第二个表为null。但我一直在获取两个表中存在的id数。我的概念错了吗 到目前为止,我的发言是: SELECT tableA.id, tableB.desiredValue FROM tableA LEFT JOIN tableB ON tableA.id=tableB.item_
SELECT tableA.id, tableB.desiredValue
FROM tableA
LEFT JOIN tableB ON tableA.id=tableB.item_id
WHERE tableB.element_id = 'something'
OR tableB.element_id IS NULL;
有什么建议吗
Thanx,致以最良好的问候,
马库斯试试这个
SELECT tableA.id, tableB.desiredValue
FROM tableA
LEFT JOIN tableB ON tableA.id=tableB.item_id
AND (tableB.element_id = 'something'
OR tableB.element_id IS NULL);
将涉及
表B
列的条件从WHERE
移动到ON
:
SELECT tableA.id, tableB.desiredValue
FROM tableA
LEFT JOIN tableB ON tableA.id=tableB.item_id
AND tableB.element_id = 'something'
--- WHERE tableB.element_id IS NULL --- this is probably not appropriate
;
总的来说,这似乎应该奏效。但是,我想在where条款中更具体一些:
SELECT tableA.id, tableB.desiredValue
FROM tableA
LEFT JOIN tableB ON tableA.id = tableB.item_id
WHERE tableB.element_id = 'something' OR tableB.item_id IS NULL;
我已经将item\u id
替换为我在中检查NULL
的行——尽管它应该会有所不同,除非在连接工作的行中element\u id
可以NULL
您能否详细说明为什么需要where子句的另一部分--tableB.element\u id='something'
?如果您只想返回所有行,我的一般建议是完全删除WHERE子句
您能否解释一下您希望返回的行的一般标准是什么?在不使用
WHERE
子句的情况下尝试。您在查询中的任何其他地方都不使用element\u id
——也许element\u id
从不为空?您的概念是正确的,如果您从消除WHERE开始,您可能会看到更接近预期的内容。如果没有,请向我们显示一些行作为示例数据,以便显示tableA中的所有项目,如果tableB中有相应的项目,也显示tableB中的项目?是的。在表A中,我说的是1000个id。在tableB中,它是一个交叉引用表(或任何被称为交叉引用表的东西),大多数id都会出现几次,作为唯一的键和第二个字段,用于标识名称或街道。连接现在总是返回与所需值所在的所有id相等的行数。e、 g.表A:id=5,表B:row1:item_id=5,type=1,value=bla第2行:item_id=5,type=2,value=blubb。项目id=7,类型=1,值=ping。在这个表上,如果我查询type=1,我会得到2个结果,甚至有3行@marcustoeper如果查询type=1
,则只会返回匹配的行。在上面的查询中,您使用或element\u id为NULL
,这将为element\u id
返回NULL。请使用数据库中的实际行以及您希望输出的内容编辑上述问题。将WHERE
作为ON
上的的一部分有点奇怪。。。再加上没有解释为什么这比OP中的代码更好,你会得到一个-1
。很好!我在WHERE子句中有tableA.id=tableB.item\u id位。按照上面描述的方式移动,它就完成了任务。非常好,thanx!