我有三张桌子:
posts (id, title, ...)
1, Post title
tags (id, name, slug)
1, Tag one, tag-1
2, Other tag, tag-2
3, Third tag, tag-3
posts_tags (id, post_id, tag_id)
1, 1, 1
2, 1, 2
3, 1, 3
我正在尝试构建一个查询,以便让所有帖子都包含所有或任何提供的标签。
这就是我现在所拥有的
SELECT DISTINCT p.* FROM posts p
LEFT JOIN post_tags pt ON pt.post_id=p.id
LEFT JOIN tags t ON t.id=pt.tag_id
-- WHERE --
ORDER BY $orderBy $order
LIMIT $limit
要获取由我使用的任何提供的标签标记的帖子
WHERE (t.slug='tag-1' OR t.slug='tag-2')
它似乎有效,但问题是当我想要通过所有提供的标签标记帖子时
WHERE (t.slug='tag-1' AND t.slug='tag-2')
即使有一个标记有tag-1和tag-2的帖子,我也会得到一个空的结果。
我没有得到任何错误只是空洞的结果。有什么想法吗?感谢
答案 0 :(得分:1)
对于所有标记,您可以执行以下操作:
SELECT p.*
FROM posts p JOIN
post_tags pt
ON pt.post_id = p.id JOIN
tags t
ON t.id=pt.tag_id
WHERE t.slug IN ('tag-1', 'tag-2')
GROUP BY p.id
HAVING COUNT(*) = 2 -- "2" is the number of tags
ORDER BY $orderBy $order;
请注意,此查询使用GROUP BY p.id
和SELECT p.*
。只要id
声明为unique
(或等效地为主键),ANSI标准实际上允许这样做。