SQL-запрос для включения нескольких тегов - PullRequest
2 голосов
/ 26 сентября 2010

Я очень хорошо объясняю это.Но я стараюсь изо всех сил:

Я создал инструмент тегирования для людей.Некоторые люди содержат более 1 тега, и мне нужно их получить, но я не знаю, как написать SQL-запрос для включения нескольких тегов.

Я знаю, что вы не можете написать условия WHERE, подобные этому:
LOWER(oples_tags.tag_id) = 'outside' AND
LOWER (oples_tags.tag_id) = 'summer'

Потому что результат каждого человека находится в своем собственном ряду, а "outside" и "summer" не будут натот же рядТаким образом, вы не получите никаких результатов с помощью этого запроса.

Это весь запрос:
ВЫБЕРИТЕ РАЗЛИЧНЫХ людей. *, Tags.tag ОТ людей
ПРИСОЕДИНЯЙТЯТЬ people_tags ONoples_tags.people_id =oples*Как написать условие SQL нескольких тегов?Кто-то знает?
Извините за мой плохой английский:)

1 Ответ

5 голосов
/ 26 сентября 2010

Вам нужно использовать OR вместо AND. Прямо сейчас ваш мыслительный процесс выглядит так: «Мне нужно получить строки, где ключевое слово« снаружи », и строки, где ключевое слово« лето », поэтому мне нужно использовать AND». Но с точки зрения СУБД, вы хотите, чтобы данная строка возвращалась, если ключевое слово «внутри» или , ключевое слово «лето» ... так что вам действительно нужно OR, а не AND.

EDIT:

Я вижу, что вы хотите сделать сейчас. Извините, что не читал более внимательно, прежде чем.

Попробуйте это (вероятно, есть более эффективный / масштабируемый способ сделать это, но это должно работать)

SELECT
    *
FROM
    people
WHERE
    EXISTS(
        SELECT
            *
        FROM
            peoples_tags
        WHERE
            peoples_tags.people_id = people.id AND
            peoples_tags.tag_id = 'outside'
    ) AND
    EXISTS(
        SELECT
            *
        FROM
            peoples_tags
        WHERE
            peoples_tags.people_id = people.id AND
            peoples_tags.tag_id = 'summer'
    )

Редактировать 2:

Предполагая, что комбинация tag_id и people_id является уникальным ключом дляoples_tags, будет также работать следующее:

SELECT
    people.*,
    COUNT(*) AS Co
FROM
    people
    JOIN peoples_tags ON people.id = peoples_tags.people_id
WHERE
    peoples_tags.tag_id = 'outside' OR
    peoples_tags.tag_id = 'summer'
GROUP BY
    people.id
HAVING
    Co = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...