我有三张桌子:

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

关于mysql - 如何获得具有ALL或ANY提供的标签的帖子?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49335191/

10-14 15:11
查看更多