2012-01-06 76 views
2
SELECT images.filename, slugs.name FROM images, slugs 
WHERE images.status = 1 AND slugs.name = 'test' 

但是,我只有1条记录,其中slugs.name = 'test'为真!当只有一条记录匹配WHERE子句时,JOIN返回多个结果?

这是怎么回事?

+0

什么是你回来的结果? – Matthew 2012-01-06 07:48:46

+0

带有images.status = 1的所有行。 – oaziz 2012-01-06 07:50:13

+0

你有多少张images.status = 1?你没有明显地加入这两张桌子。 – 2012-01-06 07:50:58

回答

7

其他人则指出你有什么错(你得到一个笛卡儿连接),但不知道如何解决它。我们需要知道images中的行如何与slugs中的行相关。比如说,如果有一个名为两个BingoID列,应该匹配,则是这样的:

SELECT images.filename, slugs.name FROM images, slugs 
WHERE images.status = 1 AND slugs.name = 'test' AND images.BingoID = slugs.BingoID 

,或者

SELECT images.filename, slugs.name 
FROM images inner join slugs 
    ON images.BingoID = slugs.BingoID 
WHERE images.status = 1 AND slugs.name = 'test' 
+0

感谢您的简化:) – oaziz 2012-01-06 08:14:39

1

这是因为你有一个以上的images.status = 1 :)

您的查询匹配的所有从表imagesname = 'test'status = 1包含所有行从表slugs行。

+0

这是正确的,但为什么slugs.name ='test'没有效果? – oaziz 2012-01-06 07:52:04

+0

它有效果。尝试消除它。你应该把另一个条件与图像和slu relate相关。 – 2012-01-06 07:54:27

2

但你可能有两个image.status = 1。
他们的方式,你写它,它几乎是一个完全连接,笛卡尔乘法。

+0

是的,slugs.name ='test'没有效果!这就是问题。 – oaziz 2012-01-06 07:52:43

1

它有一个很好的机会做一个隐式的自然连接,因为你从这样的两个表中选择。

2

图像和slu tables表如何相关?我认为你需要添加一个内部连接,因为你的查询将会返回尽可能多的名字为“test”的slu as作为图像表中的条目。

1

它使交叉连接和图像表将有多个行,然后创建一个新的表具有乘法no。这两个表的行由于这个查询给出了多个结果。

你应该尝试右外连接来获得一个结果试试这个

SELECT images.filename, slugs.name FROM images right outer join slugs 
    on images.ID = slugs.ID 
where images.status = 1 AND slugs.name = 'test' 
相关问题