powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбрать товары которые заказывают вместе
10 сообщений из 10, страница 1 из 1
Выбрать товары которые заказывают вместе
    #39931320
cu2netzov4n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть таблица заказов orders , с полями :
order_id | product_id
1 | 26
1 | 27
2 | 26

Как sql запросом получить группы product_id товаров , которые заказывались совместно как минимум в 2 заказах ?

Я пробовал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT order_id, CONCAT('[', groups, ']')  
FROM (
                        SELECT order_id, GROUP_CONCAT(DISTINCT product_id ORDER BY product_id ASC SEPARATOR ', ') AS groups 
                        FROM orders_items
                        GROUP BY order_id
                        HAVING COUNT(*) > 1
) AS vtable 
GROUP BY vtable.groups 
HAVING COUNT(*) > 1



Но так происходит сопоставление только идентичных заказов, т.е. заказов у которых количество позиций одинаковое и сами товарные позиции одинаковые.

Как добавить в выборку остальные заказы?
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39931393
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cu2netzov4n
Как sql запросом получить группы product_id товаров , которые заказывались совместно как минимум в 2 заказах ?
Два заказа с продуктами 1, 2 и 4, плюс 2 заказа с продуктами 2 и 3 - что именно должно быть выведено?
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39931409
cu2netzov4n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В идеале группы товаров, т.е. с продуктом 1 заказывают продукт 10, продукт 7 и т.д.

Либо как минимум группы состоящие из 2 продуктов, т.е. продукт 2 заказывают с продуктом 7 это одна группа, продукт 2 - продукт 7 другая группа , продукт 8 - продукт 17 ещё одна группа и т.д.(потом уже дополнительным запросом можно сгруппировать к идеальному варианту выше)
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39931462
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cu2netzov4n,

Код: sql
1.
2.
3.
4.
5.
SELECT o1.product_id, o2.product_id
FROM order_items o1
JOIN order_items o2 ON o1.order_id=o2.order_id AND o1.product_id < o2.product_id
GROUP BY o1.product_id, o2.product_id
HAVING count(*) >1
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39931508
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cu2netzov4n,

Если это не учебное задание, то надо учитывать, что отношения между товарами несимметричные.
Если с товаром А часто покупают товар Б, это не значит, что с товаром Б часто покупают товар А.
Соответственно, имеет смысл выявлять не пары товаров, а для каждого товара находить другие, которые с ним покупают с высокой вероятностью.
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39931573
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cu2netzov4n
В идеале
А на вопрос-то Вы ответить можете?

Нет, алгоритм мы можем пообсуждать - безотносительно к диалекту и вообще к программированию (правда, и раздел нужен другой), но тут-то Вы просите конкретное решение, которое в первую очередь зависит от того, что прячется у Вас в голове...
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39931588
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы думал в сторону

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT product_id, GROUP_CONCAT(companion_id ORDER BY cnt DESC) companion_ids
FROM ( SELECT t1.product_id, 
              t2.product_id companion_id,
              COUNT(*) cnt
       FROM order_items t1
       JOIN order_items t2 ON t1.order_id=t2.order_id 
         WHERE t1.product_id != t2.product_id
       GROUP BY t1.product_id, t2.product_id
       HAVING cnt > 1 ) subquery
GROU BY product_id


Возможно, дополнительно с ограничением количества товаров-компаньонов.
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39932492
cu2netzov4n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
извиняюсь что не понятно описал проблему.

В общем есть много старых заказов:
заказ №1 с товарами : 8, 7 ,25
заказ №2 с товарами : 8, 10 ,34
№3 - 25, 45, 92
№4 - 30, 32, 53
№5 - 5, 72, 53

И нужно собрать в группы товары , которые совместно с другими товарами встречаются в разных заказах.
Т.е. мы объединяем заказы № 1 , № 2, №3 между собой в одну группу , т.к. товар 8 есть в заказах № 1 и №2, а также товар 25 есть в заказах № 1 и заказе №3.

И мы объединяем заказы №4 и №5 так как товар 53 есть в обоих заказах.


Структура таблицы та же

order_id | product_id
1 | 26
1 | 27
2 | 26
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39932498
cu2netzov4n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, спасибо.
Но запрос получается долгий.

авторSELECT GROUP_CONCAT(`ttt`.`group_product`) FROM (

SELECT `product_id`, GROUP_CONCAT(`product_id`) as `group_product`
FROM `order_items`
WHERE `product_id` IN (

SELECT `product_id` FROM `order_items` GROUP BY `product_id`

)
GROUP BY `order_id`

) as `ttt`

GROUP BY `ttt`.`product_id`


Результат примерно тот которые нужен, но при объединение товаров в группы получаются группы с дублями product_id.
Неудобно что GROUP_CONCAT создает список product_id через запятую в одной строке. Конечно можно конкатенировать квадратные скобки с краев списка и получится валидный json, но не удобно.
...
Рейтинг: 0 / 0
Выбрать товары которые заказывают вместе
    #39932536
cu2netzov4n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cu2netzov4n

авторSELECT DISTINCT GROUP_CONCAT(`ttt`.`group_product`) FROM (

SELECT `product_id`, GROUP_CONCAT(`product_id`) as `group_product`
FROM `order_items`
WHERE `product_id` IN (

SELECT `product_id` FROM `order_items` GROUP BY `product_id`

)
GROUP BY `order_id`

) as `ttt`

GROUP BY `ttt`.`product_id`



Это запрос обрабатывает за несколько секунд.
Внутренний GROUP_CONCAT(`product_id`) as `group_product` собирает товары каждого заказа в отдельную ячейку.
А внешний GROUP_CONCAT(`ttt`.`group_product`) собирает получившиеся группы в большие группы , по пересечения product_id
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбрать товары которые заказывают вместе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]