当只有一条记录与WHERE子句匹配时,JOIN返回多个结果?

时间:2012-01-06 07:47:11

标签: mysql sql join

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

但是,我只有1条记录slugs.name = 'test'为真!

发生了什么事?

6 个答案:

答案 0 :(得分: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'

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

这是因为您有多个images.status = 1:)

您的查询匹配来自images的表status = 1的所有行,而slugs表中的所有行都有name = 'test'

答案 4 :(得分:1)

很有可能它正在进行隐式自然连接,因为你从两个表中选择。

答案 5 :(得分: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'