mySQL:加入找不到数据,即使它们存在

时间:2015-08-18 15:32:15

标签: mysql sql database join

我在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可以为源中的给定条目提供多个条目,但这应该没问题。我可以在其他数据库上测试这种类型的连接,并且它可以工作。

1 个答案:

答案 0 :(得分:0)

好的,所以我已经解决了这个问题 - 最终它不是一个交易问题:当我在原始机器上尝试它时,它又失败了。这是加入的顺序。看来,在我的终端,我有&#34; ON&#34;从上到下的另一个条款,就是我正在做的事情:

... LEFT JOIN sourceBS ON (sourceBS.blockSourceID=sources.sourceID)

返回所有空值。如果我这样做(如上面的代码我粘贴)

... LEFT JOIN sourceBS ON (sources.sourceID=sourceBS.sourceID

它有效。当我昨晚第二次在新机器上试用时,我使用了第二种配方。

猜猜我最好读一下连接,以了解为什么会发生这种情况!