Ещё одна интересная задачка

12
S5
На сайте с 04.01.2010
Offline
77
642

Всем добрый вечер. Необходимо реализовать сортировки для ИМ, имеем табличку с привязкой товар-сортировка-номер_сортировки

+---------+------------+---------+----------+

| shop_id | product_id | sort_id | value_id |
+---------+------------+---------+----------+
| 1 | 1 | 4 | 7 |
| 1 | 1 | 5 | 12 |
| 1 | 1 | 3 | 18 |
| 1 | 1 | 1 | 9 |
| 1 | 1 | 3 | 20 |
| 1 | 1 | 4 | 5 |
| 1 | 1 | 5 | 19 |
| 1 | 2 | 1 | 2 |
| 1 | 2 | 3 | 13 |
| 1 | 2 | 5 | 3 |
| 1 | 2 | 1 | 10 |
| 1 | 2 | 6 | 4 |
| 1 | 2 | 5 | 2 |
| 1 | 2 | 6 | 3 |
| 1 | 2 | 5 | 20 |
| 1 | 2 | 5 | 10 |
| 1 | 3 | 3 | 12 |
| 1 | 3 | 1 | 18 |
| 1 | 3 | 1 | 3 |
| 1 | 3 | 6 | 6 |
| 1 | 4 | 1 | 20 |
| 1 | 4 | 1 | 14 |
| 1 | 4 | 6 | 20 |
| 1 | 4 | 5 | 20 |
| 1 | 4 | 2 | 17 |
| 1 | 4 | 3 | 17 |
| 1 | 4 | 1 | 17 |
| 1 | 4 | 1 | 18 |
| 1 | 5 | 5 | 7 |
| 1 | 5 | 1 | 15 |
+---------+------------+---------+----------+

необходимо минимальными телодвижениями получить все товары, которые удовлетворяют всем заданным сортировкам. Пробовал использовать UNION в запросе, но он возвращает id если выполнилось хотя бы одно условие, мне же нужно чтобы выполнились все.

Пока что приходит в голову это делать запрос по каждой сортировке и получить итог через array_intersect(), но что-то мне подсказывает есть более изящные решения. Есть так же мысль использовать вложенные запросы, но до меня пока не допетрит как в 1 запрос можно выбрать product_id, который удовлетворяет сразу всем сортировкам.

Господа колдуны mysql, что скажите?

пы.сы. Товаров планируется за 150тыс+, привязанных сортировок соответственно миллион-полтора.

Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#1

Вы бы поподробнее объяснили что надо.

Из фразы:

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

мало что понятно.

S5
На сайте с 04.01.2010
Offline
77
#2

Нужно составить запрос, который сможет выбрать только те product_id, которые удовлетворяют сразу нескольким условиям (например):

WHERE ( sort_id =5 AND value_id IN ( 1, 2, 3, 5, 7, 11, 10, 13, 15, 17, 20 ))

WHERE ( sort_id =3 AND value_id IN ( 1, 2, 3, 5, 7, 9, 15, 10 ))

WHERE ( sort_id =1 AND value_id IN ( 3, 4, 11, 14, 15, 13, 16, 2 ))

Так надеюсь понятней будет.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3

Ну вы же их сами составили или в чём проблема то?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
дани мапов
На сайте с 06.09.2012
Offline
204
#4

Что то не понял, а почему не так?


WHERE ( sort_id =5 AND value_id IN ( 1, 2, 3, 5, 7, 11, 10, 13, 15, 17, 20 ))

AND ( sort_id =3 AND value_id IN ( 1, 2, 3, 5, 7, 9, 15, 10 ))

AND ( sort_id =1 AND value_id IN ( 3, 4, 11, 14, 15, 13, 16, 2 ))
Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
C
На сайте с 04.02.2005
Offline
291
#5

WHERE ( sort_id =5 AND value_id IN ( 1, 2, 3, 5, 7, 11, 10, 13, 15, 17, 20 ))

OR

( sort_id =3 AND value_id IN ( 1, 2, 3, 5, 7, 9, 15, 10 ))

OR

( sort_id =1 AND value_id IN ( 3, 4, 11, 14, 15, 13, 16, 2 ))

S5
На сайте с 04.01.2010
Offline
77
#6
Chukcha:
WHERE ( sort_id =5 AND value_id IN ( 1, 2, 3, 5, 7, 11, 10, 13, 15, 17, 20 ))
OR
( sort_id =3 AND value_id IN ( 1, 2, 3, 5, 7, 9, 15, 10 ))
OR
( sort_id =1 AND value_id IN ( 3, 4, 11, 14, 15, 13, 16, 2 ))

OR вернет результат если выполнится хоть 1 сортировка, мне же нужно чтобы выполнились все

>>Что то не понял, а почему не так?

Посмотрите на структуру базы, это первое что мне пришло в голову. Но не может быть sort_id одновременно быть равным 5 и 3 и 1

>>Ну вы же их сами составили или в чём проблема то?

Один красивый запрос

Нашел аналог UNION, который работает по обратному принципу (возвращает результат если выполнились все условия) - INTERSECT, но он есть везде кроме mysql =(

дани мапов
На сайте с 06.09.2012
Offline
204
#7

Я вижу только одну таблицу, а не структуру базы. В таблице как раз product_id со значением 1 имеет в поле sort_id значения и 5 и 3 и 1.

S5
На сайте с 04.01.2010
Offline
77
#8

Мы работаем конкретно с этой таблицей.

sort_id - сортировка

value_id - номер сортировки, закрепленной за product_id

нужно в один запрос получить product_id, который удовлетворит сразу трем условиям. Проблема в том, что это разные строки, и AND и OR тут не канают. UNION возвращает результат если выполнится хотябы одно условие из трех

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#9

а в чём обязанность всё это сделать в 1 запрос? Фейшунисты?

C
На сайте с 04.02.2005
Offline
291
#10

Ну...

from table as a

where id in (select b.id
from table as b
where id in (select c.id
from table as c
where c.sort_id =1 AND c.value_id IN ( 3, 4, 11, 14, 15, 13, 16, 2 )

Надеюсь идея понятна?

Distinct - для трех запросов

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий