Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按标签查询帖子_Mysql_Sql - Fatal编程技术网

MySQL按标签查询帖子

MySQL按标签查询帖子,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
名称
鼻涕虫

张贴标签 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
子句中的
似乎对查询没有影响,所有行都会返回。