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