MySQL按标签查询帖子
我试图在所有帖子中搜索一个特定的标签名,同时仍然能够加入所有返回帖子的标签 帖子 idMySQL按标签查询帖子,mysql,sql,Mysql,Sql,我试图在所有帖子中搜索一个特定的标签名,同时仍然能够加入所有返回帖子的标签 帖子 id 标签 id 名称 鼻涕虫 张贴标签 id post_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的帖子,但不再加入与帖子相关的其他标签。我
标签 id
名称
鼻涕虫
张贴标签 id
post_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
标签也在结果中被检索?如果您需要所有与foo相关的标签slug-related-to-post,那么您可以使用
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
如果你想要所有帖子的所有标签,包括
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
上面会给你所有的帖子和帖子的相关标签。您可以orderbyslug
,也可以添加一个带有left join的子句,以按需要的标记进行筛选,如下所示:
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
如果您想要所有以“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;
对于此结果,您不需要
posts
表。您需要posts表,因为我想将标记连接到posts。。。不要只从帖子中获取标签。如果问题还不清楚,我将更新它。我的答案中的查询将重试相关的不同标记..您可以使用post向此查询添加一个连接以获取post。。。anway anway anway anway anway anway anway anway anway更新感谢您花时间回答问题。我很好奇为什么您选择从标签中选择,从帖子中选择并加入帖子
表不是更有意义吗?如果您查看这两个查询,您会发现第二个查询是一个简单地添加了join to post的查询。。。我的第二个问题是,我建议你,一旦你有了第一个,第二个就自然了。一旦你有了一个正常工作的查询,那么你就可以更改内部查询的顺序,以查看最佳性能。。。使用解释计划..结果应该是什么样的?请发布一个结果集示例。这个问题不是不言自明的吗?你没有看到所有不同的答案吗?所以不-这不是自解释的。我不希望它们出现在列表中,因为我也希望标签表中的其他列。in
子句中的似乎对查询没有影响,所有行都会返回。