Поиск сообщений с 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!

Ответы на вопрос(2)

Ваш ответ на вопрос