如何获得包含所有或任何提供标签的帖子?

时间:2018-03-17 10:58:32

标签: mysql sql

我有三张桌子:

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的帖子,我也会得到一个空的结果。

我没有得到任何错误只是空洞的结果。有什么想法吗?感谢

1 个答案:

答案 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.idSELECT p.*。只要id声明为unique(或等效地为主键),ANSI标准实际上允许这样做。