Предложение SQL CASE в предложении ORDER BY с JOIN - PullRequest
1 голос
/ 04 октября 2019

У меня есть 3 стола:

  1. наряд
  2. предмет
  3. цвет

стол наряд имеет вещи с объектами ManyToMany
таблица элементов имеет отношение к цвету с отношением manyToOne

Отношения выглядят так

DB Scheme

Мне нужно создать функцию поиска сэта логика: если пользователь вводит "красный airmax", я ищу одежду, если нет одежды с этим именем, я ищу продукт, если нет также одежды с этим именем, я ищу по цвету

, поэтому, когда я ищу по цвету, яполучил элементы с красным цветом, но не с airmax, и я хочу найти airmax в элементах по этой логике, если DB обнаружит продукты с красным цветом, проверьте также название продукта airmax

Я использую symfony / doctrine. мой sql-код с цветами будет выглядеть так:

SELECT o FROM OutfitsBundle:Outfits o
LEFT JOIN o.item i
LEFT JOIN i.color c
WHERE c.name LIKE '%red%'
OR c.name LIKE '%airmax%'
GROUP BY o.id 
ORDER BY 
CASE 
 WHEN i.name LIKE '%airmax%' THEN 1
 ELSE 0
END

Так что это неправильно, потому что если мне нужно отсортировать по кейсу, мне нужно добавить i.id к предложению GROUP BY, но мне нужно получить только наряды

Цельчтобы получить в первую очередь те товары, которые имеют ключевое слово в своем имени

Пока я не имею ни малейшего представления о том, чтобы искать по названию товара только airmax, а не красный, если кто-нибудь знает, как это сделать, скажите, пожалуйста, также об этом

Пример БД

Таблица: экипировка
id: 1, имя: 'vero moda';
id: 2, имя: 'street one';

Таблица: Элементы
id: 1, color_id: 3, имя: 'Vero moda sweatch';
id: 2, color_id: 1, имя: 'Nike Airmax';
id: 3, color_id: 2, имя: 'Pepe jeans';
id: 4, color_id: 2, имя: 'Naketano';
id: 5, color_id: 3, имя: 'Dockers ByGerli Stiefel ';
id: 6, color_id: 2, имя:' Jeans ';

Таблица: Outfititems
id: 1, outfit_id: 1,item_id: 1;
id: 2, outfit_id: 1, item_id: 5;
id: 3, outfit_id: 1, item_id: 6;
id: 4, outfit_id: 2, item_id: 2;
id: 5, outfit_id: 2, item_id: 3;
id: 6, outfit_id: 2, item_id: 4;

Таблица: Цвет
идентификатор: 1, имя: черный;
идентификатор: 2, имя: синий;
идентификатор: 3, имя: розовый;

1 Ответ

0 голосов
/ 05 октября 2019

Вы предоставили недостаточно деталей, но я постараюсь ...

SELECT distinct o.name

FROM outfits o
  inner JOIN item i = i.itemid = o.itemid
  inner JOIN color c on c.colorid = i.colorid

WHERE c.name LIKE '%red%'
   OR c.name LIKE '%airmax%'
   or o.name like '%red%'
   OR o.name LIKE '%airmax%'
   or i.name like '%red%'
   OR i.name LIKE '%airmax%'

ORDER BY 
CASE 
   WHEN o.name LIKE '%airmax%' THEN 1
   ELSE 0
END desc
...