多标签搜索

时间:2013-05-31 07:52:56

标签: php mysql search tags

我正在尝试在我的帖子标签中进行多个标签搜索。 所以我有一个表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在任何帖子中都有,则该帖子会返回。但我正在寻找该帖子的所有标签。

4 个答案:

答案 0 :(得分:1)

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'

答案 1 :(得分: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子句可确保查询仅返回包含所有(示例中为三个)标记的帖子。

这是 SQLFiddle 演示

答案 2 :(得分:0)

通过字符串中的逗号分隔搜索标记ID,并使用以下查询:

select id_post from tags_posts where id_tag  IN ($search)

答案 3 :(得分:0)

您可以使用&#34; IN&#34;在MySQL中为您的解析标签声明?

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')