Поиск сообщений с tag1 и tag2? (с использованием таблицы соединений) Существует / Имеет / Подзапросы ... Что использовать?
Мне нужно сделать запрос для поиска и фильтрации по нескольким терминам.
У меня есть таблица с оружием, и все могут иметь несколько тегов.Я хочу иметь возможность создать опцию фильтра для пользователя, который показывает только оружие с, например, «tag1» И «tag2».
До сих пор:
Я фильтровал их, используяGROUP_CONCAT
сHAVING
до сих пор, но это имеет проблемы с производительностью! Как я вынужден сделатьGROUP BY w.id
Но я хочу сделатьORDER BY
что-то другое. И GROUP BY не очень хорошо играет с ORDER BY ....
Я пытался создать что-то с помощью EXISTS (SELECT…), чтобы можно было фильтровать по нескольким значениям, однако я не уверен, что буду делать это, когда в середине есть «таблица соединений» (то есть с двумя левыми соединениями)
weapons:
id | name
----------
1 | sword
2 | shield
weapon_tag_links:
tag_id | weapon_id
-------------------
62 | 1
80 | 1
80 | 2
60 | 2
weapon_tags:
tag_id | tag
--------------
60 | red
62 | blue
80 | old
Поисковый запрос:
SELECT DISTINCT * FROM weapons as w
LEFT JOIN weapon_tag_links AS l ON l.weapon_id = w.id
INNER JOIN weapon_tags AS t ON l.tag_id = t.tag_id
WHERE EXISTS (
****** Something to go here *******
WHERE t.tag = ‘blue’
) AND EXISTS (
****** Something to go here *******
WHERE t.tag = ‘old’
)
Я просто пропускаю нужную вам ссылкуEXISTS
, Но я не уверен, как добавить это ...
Вопрос:
Скажем, я хочу найти запись в оружии, котороеblue
А ТАКЖЕold
(меч в данном случае) как мне это сделать?
Я не говорю, что ДОЛЖЕН использовать «EXISTS», но я хочу найти лучший оптимизированный способ поиска сообщений с определенными тегами, связанными сAND
!