我在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
是使用cascade选项在源中引用其同名的外键。我测试了这个:如果我在源代码中删除了一个条目,那么sourceBS中的相应条目也会消失。好。
我想从来源和 sourceBS 的加入中选择一些内容,过滤基于&#34;来源&#34;属性。这应该很容易,通过一个连接,我认为,外键应该提高效率,所以:
SELECT sources.sourceID, sourceBS.*
FROM sources
LEFT JOIN sourceBS ON sources.sourceID = sourceBS.sourceID
WHERE trigger=1;
但是当它运行时,每一行都有&#34; NULL
&#34;对于从 sourceBS 返回的值,即使 sourceBS 也包含与条件匹配的条目。我可以验证一下:
SELECT *
FROM sourceBS
WHERE sourceID IN (
SELECT sourceID
FROM sources
WHERE trigger=1
);
这里我得到一组适当的结果,即非空值。但是,虽然这可以作为概念的证明,但它在现实生活中并不好,因为我想要回收来自&#34;来源的一堆东西。也是如此,我不想运行多个查询以获得我想要的内容。
返回连接,如果我用内连接替换左连接,则不返回任何结果。好像,某种程度上,&#34;加入&#34;只是没有在sourceBS表中找到任何匹配,但它们就像第二个查询所示那样。
为什么会这样?我知道这个连接有一个1:M的关系,sourceBS可以为源中的给定条目提供多个条目,但这应该没问题。我可以在其他数据库上测试这种类型的连接,并且它可以工作。
答案 0 :(得分:0)
好的,所以我已经解决了这个问题 - 最终它不是一个交易问题:当我在原始机器上尝试它时,它又失败了。这是加入的顺序。看来,在我的终端,我有&#34; ON&#34;从上到下的另一个条款,就是我正在做的事情:
... LEFT JOIN sourceBS ON (sourceBS.blockSourceID=sources.sourceID)
返回所有空值。如果我这样做(如上面的代码我粘贴)
... LEFT JOIN sourceBS ON (sources.sourceID=sourceBS.sourceID
它有效。当我昨晚第二次在新机器上试用时,我使用了第二种配方。
猜猜我最好读一下连接,以了解为什么会发生这种情况!