任何人都可以解释为什么此查询返回空结果。
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
是相互关联的。
答案 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
)
(顺便说一句,我假设书签不能两次给定标签)。