我正在尝试搜索特定标记名称的所有帖子,同时仍然可以加入返回帖子的所有标记。
ID
...
ID
命名
蛞蝓
ID
POST_ID
TAG_ID
我会做一个这样的查询:
SELECT * FROM posts p
INNER JOIN posts_tags pt ON pt.post_id = p.id
INNER JOIN tags t ON pt.tag_id = t.d
WHERE t.slug = 'foo'
这会返回标有foo
标签的所有帖子,但不会再加入与帖子关联的其他标签。如何以这种方式编写它以便我仍然能够在帖子上获得所有标签?
例如,假设我的帖子中有3个与之关联的标签:cat
,dog
和chimp
。我想对标记为dog
的帖子进行查询。如何构建一个查询,该查询会向我提取标记为dog
的帖子,确保在结果中还检索cat
和chimp
标记?
答案 0 :(得分:0)
如果您需要与帖子相关的所有与foo相关的标签slug,那么您可以使用
select distinct tags.slug
from tags
inner join (
SELECT post_id from posts_tags pt
INNER JOIN tags t ON pt.tag_id = t.d
WHERE t.slug = 'foo'
) t on t.id = post_tags.post_id
inner join tags on tags.id = post_tags.tag_id
或者如果您还需要相关的帖子
select post.*, tags.slug
from tags
inner join (
SELECT post_id from posts_tags pt
INNER JOIN tags t ON pt.tag_id = t.d
WHERE t.slug = 'foo'
) t on t.id = post_tags.post_id
inner join tags on tags.id = post_tags.tag_id
inner join post on post.id = post_tag.post_id
答案 1 :(得分:0)
如果您想要包含foo
以及所有其他标签的所有帖子的所有标签,那么我认为您可以进行左连接。
SELECT * FROM posts p
INNER JOIN posts_tags pt ON pt.post_id = p.id
LEFT JOIN tags t
ON pt.tag_id = t.d
以上将为您提供帖子的所有帖子和相关标签。你可以order by slug
或者你可以添加一个左连接的子句来过滤你需要的标签,如下所示:
SELECT * FROM posts p
INNER JOIN posts_tags pt ON pt.post_id = p.id
LEFT JOIN tags t
ON pt.tag_id = t.d AND t.slug IN ('foo') --add other tags if needed
答案 2 :(得分:0)
如果你想要所有帖子都有'foo'作为标签,那么你需要更复杂的逻辑。出于您的目的,我认为将标记作为分隔列表可能就足够了:
SELECT p.*, GROUP_CONCAT(t.slug) as tags
FROM posts p INNER JOIN
posts_tags pt
ON pt.post_id = p.id INNER JOIN
tags t
ON pt.tag_id = t.d
GROUP BY p.id
HAVING SUM(t.slug = 'foo') > 0;