@montecazazza
Node, GraphQL, React

Можно ли сделать SQL такого вида?

Подскажите можно ли сделать SQL запрос способный сделать следующую выборку:
есть 4 таблицы
1) Штуки
2) Тэги
3) Категории
4) Штуки_Тэги

связи следующие

Категории 1 - М Тэги (Тэги разделены на категории)
Штуки М - М Тэги через таблицу Штуки_Тэги

Пример
Категории тэгов Цвет, Длина, Ширина
Тэги (Красный, Синий, Зеленый), (Длинный, Короткий, Не длинный), (Широкий, Узкий) соответственно

У каждой Штуки может быть любое количество тэгов из любой категории, таким образом, Штука может быть одновременно Красной и Зеленой, Короткой и Длиной

Выбор штуки по тэгам осуществляется следующим образом

Тэги внутри категории Штуки фильтруются по тэгам след образом
при выборе тэгов Красный, Синий нужно найти штуки которые имеют любой из этих тэгов ИЛИ Красный, ИЛИ Синий, ИЛИ оба тэга

Тэги из разных категорий фильтруют штуки след образом
при выборе Красный, Длиный должны быть выбраны штуки которые имеют ОБА этих тега
при этом Штука может иметь и другие тэги, для запроса они не релевантны.

Таким образом в общем виде правило можно записать так

Выбрать Штуки в которых выбранные теги так, что
категория1(тэг1 ИЛИ тэг2 ИЛИ тэг3 …) И категория2(тэг4 ИЛИ тэг5 …) …

Может быть выбрано любое количество тэгов в любом количестве категорий, Нужно показать Штуки отвечающие вышеизложенным правилам

Можно ли написать такой запрос в принципе? А если кто поможет написать, то будет тому счастье!
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `i`.`*`
  FROM `items` AS `i`
  JOIN `items_tags` AS `it` ON `it`.`item_id` = `i`.`id`
  JOIN `tags` AS `t1` ON `t1`.`id` = `it`.`item_id` 
    AND `t1`.`category_id` = 'Цвет'
    AND `t1`.`value` IN ('Синий', 'Красный')
  JOIN `tags` AS `t2` ON `t2`.`id` = `it`.`item_id` 
    AND `t2`.`category_id` = 'Длина'
    AND `t2`.`value` IN ('Длинный')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы