【问题标题】:Multiple tag search多标签搜索
【发布时间】:2013-05-31 07:52:55
【问题描述】:

我正在尝试在我的帖子标签中进行多个标签搜索。 所以我有一张表tags_posts(列是id_tagid_post)。

如果用户输入了几个标签(我将使用逗号和数组分隔并解析它们),sql 查询应该返回在用户输入中包含所有标签的所有帖子。

Here's my database table

我尝试过的:

SELECT DISTINCT id_post, content, author_id, created, updated, username FROM tags_posts INNER JOIN posts ON posts.id=tags_posts.id_post INNER JOIN users ON users.id=posts.author_id WHERE id_tag IN (:tagids)

但在这种情况下,如果 :tagids 中的任何“一个”在任何帖子中,则该帖子会返回。但我正在寻找该帖子的所有标签。

【问题讨论】:

  • 欢迎来到 Stackoverflow。由于您是新手,因此我建议您在发布之前阅读此内容:whathaveyoutried.com

标签: php mysql search tags


【解决方案1】:

试试

SELECT * 
  FROM posts a JOIN
(
 SELECT p.id
   FROM tag_posts tp JOIN posts p 
     ON tp.post_id = p.id JOIN tags t 
     ON tp.tag_id = t.id
  WHERE t.name IN ('tag1', 'tag2', 'tag3')
  GROUP BY p.id
 HAVING COUNT(DISTINCT t.id) = 3 -- << should the number of tags used in WHERE clause
) q ON a.id = q.id

HAVING 子句确保查询只返回具有 all(例如三个)标签的帖子。

这里是SQLFiddle演示

【讨论】:

  • 看起来像我要找的东西,但最后一条语句中的 a 和 q 是什么:ON a.id = q.id
  • @alayli 这些分别是posts 表和子查询的外部选择中的别名。
  • 在检查了 sqlfiddle 演示后,我尝试了,它现在可以工作了。谢谢@peterm。
【解决方案2】:
SELECT posts.id, posts.content, posts.created, posts.updated, posts.author_id, users.username 
FROM posts 
INNER JOIN users
    on users.id = posts.author_id 
INNER JOIN tags_posts 
    ON tags_posts.id_post = posts.id
INNER JOIN tags 
    ON tags.id = tags_posts.id_tag 
WHERE tags.name = 'tag1' 
    AND tags.name = 'tag2' 
    AND tags.name = 'tag3'

【讨论】:

  • 谢谢,但没有像我预期的那样工作。 tag1,tag2,tag3(所有这些)都应该在返回帖子中。但在这种情况下,如果该帖子中有任何标签,则帖子返回。
  • 我已经更新了我的答案,这应该会检索到其中指定了所有关键字的所有帖子 :)
  • 我正在寻找缺少的东西,但是在 tag1 之后我用and 写的任何东西都从 sql 返回空结果。
【解决方案3】:

在字符串中传递要搜索的标签 ID,以逗号分隔,例如 $search 并使用以下查询:

select id_post from tags_posts where id_tag  IN ($search)

【讨论】:

  • 不是我除了。如果您查看at the your demo,结果会收集该数组中的所有标签。结果应该只有post2,因为只有post2ALL tags
【解决方案4】:

您可以使用 MySQL 中的“IN”语句来解析标签吗?

SELECT *
FROM Posts
LEFT JOIN Tag_Posts 
    ON Tag_Posts.Id_post = Posts.id
INNER JOIN Tags
    ON Tags.id = Tag_Posts.Id_tag
WHERE Tags.name IN('PHP','SQL','LAMP')

【讨论】:

  • 不是我除了。如果您查看at the your demo,结果会收集该数组中的所有标签。结果应该只有 post2 因为只有 post2 有 ALL 标签。
猜你喜欢
  • 1970-01-01
  • 2013-07-23
  • 2012-12-06
  • 2012-02-04
  • 1970-01-01
  • 2011-06-25
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多