gpt4 book ai didi

mySQL:连接找不到数据,即使它们存在

转载 作者:行者123 更新时间:2023-11-29 22:06:57 25 4
gpt4 key购买 nike

我的 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 是一个外键,使用级联选项引用源中的同名元素。我已经测试过这一点:如果我删除sources中的条目,sourceBS中相应的条目也会消失。很好。

我想从 sourcessourceBS 的联接中选择一些内容,并根据“sources”属性进行过滤。这应该很容易,通过连接,我认为外键应该表现得非常有效,所以:

SELECT sources.sourceID, sourceBS.* 
FROM sources
LEFT JOIN sourceBS ON sources.sourceID = sourceBS.sourceID
WHERE trigger=1;

但是当运行时,每行对于从 sourceBS 返回的值都有“NULL”,即使 sourceBS 包含与条件匹配的条目。我可以验证这一点:

SELECT * 
FROM sourceBS
WHERE sourceID IN (
SELECT sourceID
FROM sources
WHERE trigger=1
);

这里我得到了一组正确的结果,即非空值。但是,虽然这可以作为概念证明,但在现实生活中并没有什么好处,因为我也想从“源”表中返回一堆内容,并且我不想为了运行多个查询而运行多个查询。得到我想要的。

回到连接,如果我用内连接替换左连接,则不会返回任何结果。就好像,不知何故,“连接”只是在 sourceBS 表中找不到任何匹配项,但正如第二个查询所示,它们仍然存在。

为什么会发生这种情况?我知道这个连接有 1:M 关系,sourceBS 可以有源中给定条目的多个条目,但这应该没问题。我可以在其他数据库上测试这种类型的联接,并且它有效。

最佳答案

好的,所以我已经解决了这个问题 - 最终这不是事务问题:当我在原来的机器上尝试时,它再次失败。这是加入的顺序。看来在我的终端中我有“ON”子句,与上面相反,也就是说,我正在做:

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

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

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

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

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

关于mySQL:连接找不到数据,即使它们存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32076676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com