我有三张桌子:
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的帖子,我也得到了一个空结果。
我没有任何错误,只是一个空洞的结果。你知道为什么吗?谢谢
最佳答案
对于所有标记,您可以执行以下操作:
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标准就允许这样做。关于mysql - 如何获得具有ALL或ANY提供的标签的帖子?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49335191/