【发布时间】: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 中的相应条目也会消失。很好。
我想从 sources 和 sourceBS 的连接中选择一些东西,基于“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:- 你必须知道,如果你提出问题,那么用一些最小的可重现的例子证明什么是行不通的。以便社区可以帮助您解决此问题。不要在没有任何示例的情况下发布状态为“这不起作用”的问题
-
查询没问题。可能是您的表格中没有任何匹配的信息。提供一些您在数据库中真正拥有的示例值,并且您希望它们应该作为结果返回