我有三张桌子:
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')即使有一个标记为标签-1和标签-2的帖子,我也得到了一个空的结果。
我没有任何错误,只是一个空的结果。知道为什么吗?谢谢
发布于 2018-03-17 11:00:55
对于所有标签,您可以:
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.*。这实际上是ANSI标准所允许的,只要id声明为unique (或等效为主键)。
https://stackoverflow.com/questions/49335191
复制相似问题