我在mySQL数据库中有几个表。为了简单起见,我只显示一些基本字段:
表:来源:
sourceID int not null unique primary key
trigger int not null
<other stuff>
表:sourceBS
id not null unique primary key
sourceID int not null,
name varchar(20),
sourceBS表中的
SourceID
是一个外键,引用它与源中的名称相同,并带有层叠选项。我已经对此进行了测试:如果删除源中的条目,则sourceBS中的相应条目也将消失。好。我想从source和sourceBS的连接中选择一些东西,并基于“ sources”属性进行过滤。通过联接,这应该很容易,我认为外键应该非常有效,因此:
SELECT sources.sourceID, sourceBS.*
FROM sources
LEFT JOIN sourceBS ON sources.sourceID = sourceBS.sourceID
WHERE trigger=1;
但是,当运行此命令时,即使sourceBS包含与条件匹配的条目,每行对于sourceBS返回的值都具有“
NULL
”。我可以验证一下:SELECT *
FROM sourceBS
WHERE sourceID IN (
SELECT sourceID
FROM sources
WHERE trigger=1
);
在这里,我得到了一组正确的结果,即非null值。但是,虽然这只是概念上的证明,但在现实生活中并没有什么用,因为我也想从“ sources”表中返回一堆东西,并且我不想运行多个查询来得到我想要的。
返回到联接,如果我将左联接替换为内部联接,则不会返回任何结果。好像“联接”只是在sourceBS表中找不到任何匹配项一样,但是如第二个查询所示,它们在那里。
为什么会这样呢?我知道此联接具有1:M的关系,sourceBS可以为源中的给定条目包含多个条目,但这应该可以。我可以在其他数据库上测试这种连接类型,并且可以正常工作。
最佳答案
好的,所以我已经解决了这个问题-最终不是交易问题:当我在原始计算机上尝试时,它再次失败。这是加入的顺序。似乎在我的终端机中,我有一个“ ON”子句与上面的相反,也就是说,我在做:
... LEFT JOIN sourceBS ON (sourceBS.blockSourceID=sources.sourceID)
返回所有空值。如果我这样做(就像上面粘贴的代码一样)
... LEFT JOIN sourceBS ON (sources.sourceID=sourceBS.sourceID
有用。昨晚第二次在新机器上尝试时,我使用了第二种公式。
猜猜我最好阅读联接,以了解为什么会发生这种情况!