2013-05-31 3 views
0

Я пытаюсь сделать несколько поиска тегов в теге сообщения. У меня есть таблица tags_posts (колонки id_tag и id_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 имеет в любой должности, что посты возвращается. Но я ищу все теги для этого сообщения.

+0

Добро пожаловать в Stackoverflow. Поскольку вы новичок, я рекомендую прочитать это перед публикацией: whathaveyoutried.com –

ответ

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 демо

+0

Похоже на то, что я ищу, но что такое a и q в последнем утверждении: 'ON a.id = q.id' – alayli

+0

@alayli Это псевдонимы во внешнем select для таблицы' posts' и подзапроса соответственно. – peterm

+0

После проверки демонстрации sqlfiddle я попытался и теперь работает. Спасибо @peterm. – alayli

0

Pass тег Идентификаторы для поиска через запятую в строке скажут $ поиска и использовать следующий запрос:

select id_post from tags_posts where id_tag IN ($search) 
+0

Не то, что я исключаю. Если вы посмотрите [на свое демо] (http://sqlfiddle.com/#!2/7e851/27), результат будет собирать все теги в этом массиве. Результат должен быть только 'post2', потому что только' post2' имеет 'ВСЕ теги'. – alayli

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' 
+0

Спасибо, но не работает, как я и ожидал. tag1, tag2, tag3 (все они) должны иметь возвращаемый пост. Но в этом случае, если какой-либо из этих тегов в этом сообщении, post возвращается. – alayli

+0

Я обновил свой ответ, это должно получить все сообщения со всеми указанными в нем ключевыми словами: –

+0

Я ищу то, что отсутствует, но после tag1 все, что я написал с 'и', возвращает пустой результат из sql. – alayli

0

Вы можете использовать "IN" заявление в 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') 
+0

Не то, что я кроме. Если вы посмотрите [на свое демо] (http://sqlfiddle.com/#!2/7e851/23), результат будет собирать все теги в этом массиве. Результат должен быть только post2, потому что только post2 имеет ВСЕ теги. – alayli

Смежные вопросы