MySQL按标签查询帖子

时间:2017-03-21 17:35:21

标签: mysql sql

我正在尝试搜索特定标记名称的所有帖子,同时仍然可以加入返回帖子的所有标记。

帖子

ID
...

标记

ID
命名
蛞蝓

posts_tags

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个与之关联的标签:catdogchimp。我想对标记为dog的帖子进行查询。如何构建一个查询,该查询会向我提取标记为dog的帖子,确保在结果中还检索catchimp标记?

3 个答案:

答案 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;