【问题标题】:mySQL: join not finding data, even though they existmySQL:加入未找到数据,即使它们存在
【发布时间】:2015-11-11 15:24:15
【问题描述】:

我在 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 中的相应条目也会消失。很好。

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

【问题讨论】:

  • 提供SQL Fiddle 演示问题。
  • 包括样本数据,以便可以重现问题。
  • 我创建了一个 SQL Fiddle,它应该封装 OP 想要的东西,但问题似乎没有发生。 See Here
  • @Phil Evans:- 你必须知道,如果你提出问题,那么用一些最小的可重现的例子证明什么是行不通的。以便社区可以帮助您解决此问题。不要在没有任何示例的情况下发布状态为“这不起作用”的问题
  • 查询没问题。可能是您的表格中没有任何匹配的信息。提供一些您在数据库中真正拥有的示例值,并且您希望它们应该作为结果返回

标签: mysql sql database join


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多