MySQL Выберите, где Tag = "Первый тег" И Tag = "Другой тег", используя справочную таблицу - PullRequest
0 голосов
/ 24 апреля 2020

У меня следующая структура базы данных:

text

Таблица peekable_tag, по сути, является словарем множества различных тегов.

Таблица peekable_url представляет собой таблицу, заполненную различными URL-адресами, и затем каждый URL-адрес может быть связан с несколькими тегами.

Например, для такого URL, как carmechani c .com, могут быть назначены теги "Car" и "Mechani c". И URL, такой как teslacardirectory.com, может иметь три тега: «Car», «Tesla» и «Mechani c», назначенные ему.

, используя следующий запрос, я могу получить все URL, которые им присвоено 1 ключевое слово, например, ключевое слово "Car"

Select
peekable_tag.tag,
peekable_url.id,
peekable_url.url
From
peekable_tag Inner Join
peekable_urltotag On peekable_urltotag.peekable_tag_id = peekable_tag.id Inner Join
peekable_url On peekable_urltotag.peekable_URL_id = peekable_url.id
Where
peekable_tag.tag = 'Car'

Вернет оба URL.

Однако ...

Как мне изменить это, чтобы я можно сузить поиск по нескольким ключевым словам? Так что, если бы я искал "Car" и "Tesla" в качестве ключевого слова, появился бы только teslacardirectory.com.

Я пытался

peekable_tag.tag = 'Car' AND peekable_tag.tag = 'Tesla'

Но это не возвращает никаких результатов.

Я думал о вложении одного поискового запроса в другой, но тогда я бы ограничился использованием только двух ключевых слов. Или вложите три запроса, но тогда id будет ограничен 3 ключевыми словами ... Есть ли способ достичь того, что я пытаюсь сделать, не ограничивая количество используемых ключевых слов?

1 Ответ

1 голос
/ 24 апреля 2020

Использование агрегации:

Select u.id, u.url
From peekable_tag t Inner Join
     peekable_urltotag ut
     On ut.peekable_tag_id = t.id Inner Join
     peekable_url u
     On ut.peekable_URL_id = u.id
Where t.tag in ('Car', 'Tesla')
group by u.id, u.url
having count(*) = 2;  -- both tags match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...