Проверить все возможные комбинации довольно сложно, поскольку их слишком много .
Однако, если вы немного упростите свои требования, вы можете получить что-то полезное.
Давайте начнем с поиска всех комбинаций двух предметов. В начале вы можете попробовать следующий запрос:
SELECT
c1.cart_id AS cart1_id
, c1.object_id AS object1_id
, c2.object_id AS object2_id
, cx1.cart_id AS cartX_id
, cx1.object_id AS objectX1_id
, cx2.object_id AS objectX2_id
FROM
cart_item AS c1
INNER JOIN cart_item AS c2 ON (
c2.cart_id = c1.cart_id
AND c2.object_id > c1.object_id
)
INNER JOIN cart_item AS cx1 ON (
cx1.cart_id > c1.cart_id
AND cx1.object_id = c1.object_id
)
INNER JOIN cart_item AS cx2 ON (
cx2.cart_id = cx1.cart_id
AND cx2.object_id = c2.object_id
)
ORDER BY
c1.cart_id
, c1.object_id
, c2.object_id
, cx1.cart_id
, cx1.object_id
, cx2.object_id
В запросе есть две идеи:
- Получить все возможные комбинации двух идентификаторов объектов, которые существуют в
тележки. Тележки с одним предметом будут исключены. Единственный существующий
будут проанализированы комбинации (вместо всех возможных комбинаций). [c1 & c2]
- Найти другие тележки с одинаковыми комбинациями идентификаторов объектов [cx1 & cx2]
Результаты будут примерно такими:
cart1_id object1_id object2_id cartX_id objectX1_id objectX2_id
3 10 18 30 10 18
3 10 18 31 10 18
3 10 21 30 10 21
3 18 21 30 18 21
30 10 18 31 10 18
Затем вы можете сгруппировать эти результаты, чтобы получить «самые популярные» пары:
SELECT
cx1.object_id AS object1_id
, cx2.object_id AS object2_id
, 1 + COUNT(DISTINCT cx1.cart_id) AS cnt
FROM
cart_item AS c1
INNER JOIN cart_item AS c2 ON (
c2.cart_id = c1.cart_id
AND c2.object_id > c1.object_id
)
INNER JOIN cart_item AS cx1 ON (
cx1.cart_id > c1.cart_id
AND cx1.object_id = c1.object_id
)
INNER JOIN cart_item AS cx2 ON (
cx2.cart_id = cx1.cart_id
AND cx2.object_id = c2.object_id
)
GROUP BY
cx1.object_id
, cx2.object_id
ORDER BY
cnt DESC
LIMIT
20
Результаты:
object1_id object2_id cnt
10 18 3
10 21 2
18 21 2
Таким образом, пара 10 + 18 является самой популярной и существует в 3 тележках.
Пары 10 + 21 и 18 + 21 находятся в 2 разных тележках.
Вы можете продолжить и сделать что-то подобное для комбинаций из 3 объектов.
P.S. Я использовал следующий набор данных (добавил несколько строк к вашим данным, чтобы получить немного более интересные результаты):
id cart_id object_id
10 2 24
9 3 10
3 3 18
19 3 21
12 4 24
1 7 30
5 9 24
2 11 10
20 14 12
14 14 18
8 14 27
13 15 11
7 16 9
18 16 13
15 20 11
6 21 6
4 23 5
17 23 6
16 25 16
11 29 11
23 30 1
21 30 10
22 30 18
24 30 21
25 31 10
26 31 18
P.P.S. Я не тратил на это слишком много времени, поэтому, возможно, я что-то пропустил в запросах Тем не менее, я надеюсь, что вы понимаете общую идею.