0

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

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

这是我的数据库表

我试过的:

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

4 回答 4

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'
于 2013-05-31T07:57:42.180 回答
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演示

于 2013-05-31T07:58:26.167 回答
0

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

select id_post from tags_posts where id_tag  IN ($search)
于 2013-05-31T07:56:26.043 回答
0

您可以使用 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')
于 2013-05-31T08:00:53.413 回答