Join Query返回空结果,意外结果

时间:2010-04-04 23:29:19

标签: sql mysql

任何人都可以解释为什么此查询返回空结果。

SELECT *
FROM (`bookmarks`)
JOIN `tags` ON `tags`.`bookmark_id` = `bookmarks`.`id`
WHERE `tag` = 'clean'
AND `tag` = 'simple'

在我的书签表中,我有一个id为70的书签,在我的代码表中,我有两个标签'clean'和'simple',它们都将列bookmark_id设为70。我会想到结果会被退回吗?

如何解决此问题,以便在标签为“干净”和“简单”时返回书签?

感谢大家对此的任何解释和解决方案。

更新

我的标签表包含许多标签。书签可以包含许多标签。书签表中的id和代码表中的bookmark_id是相互关联的。

3 个答案:

答案 0 :(得分:6)

不太可能有一行标签等于'干净'和'简单':)

所以尝试用OR代替AND:

WHERE `tag` = 'clean'
OR `tag` = 'simple'

如果您只打算检索包含两个标记的书签,请考虑双exists子句:

SELECT *
FROM bookmarks b
WHERE EXISTS (
    SELECT *
    FROM tags t
    WHERE t.tag = 'simple'
    AND t.bookmark_id = b.id
) AND EXISTS (
    SELECT *
    FROM tags t
    WHERE t.tag = 'clean'
    AND t.bookmark_id = b.id
)

也可以使用having声明进行检查:

SELECT    b.id
FROM      bookmarks b
JOIN      tags t
ON        t.bookmark_id = b.id
          AND t.tag in ('clean','simple')
GROUP BY  b.id
HAVING    COUNT(distinct t.tag) = 2

count将确保找到两个标记。

答案 1 :(得分:2)

你没有行,因为你的where子句是不可能满足的。

要获得标记为“clean”且标记为“simple”的书签,您需要将标记表连接两次。尝试这样做:

SELECT bookmarks.*
FROM bookmarks
JOIN tags AS T1 ON T1.bookmark_id = bookmarks.id AND T1.tag = 'clean'
JOIN tags AS T2 ON T2.bookmark_id = bookmarks.id AND T2.tag = 'simple'

答案 2 :(得分:1)

Select ...
From `bookmarks`
Where Exists(
            Select 1
            From `tags`
            Where `tags`.`bookmark_id` = `bookmarks`.`id`
                And 'tag' In('clean','simple')
            Having Count(*) = 2
            )

(顺便说一句,我假设书签不能两次给定标签)。