Получить столбец со списком object_id, который встречается более одного раза, и второй столбец со счетчиком того, сколько раз это произошло - PullRequest
0 голосов
/ 10 июля 2019

enter image description here

Обратите внимание, что значения 18,10 и 21 для object_id связаны с cart_id 3 один раз.Я хочу знать, встречается ли комбинация снова в другом cart_id и сколько раз это происходит во всех существующих строках.Я ожидаю два столбца в качестве набора результатов "комбинация" и "комбинация_occurrence_count"

Ответы [ 3 ]

2 голосов
/ 10 июля 2019

Проверить все возможные комбинации довольно сложно, поскольку их слишком много .

Однако, если вы немного упростите свои требования, вы можете получить что-то полезное.

Давайте начнем с поиска всех комбинаций двух предметов. В начале вы можете попробовать следующий запрос:

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. Я не тратил на это слишком много времени, поэтому, возможно, я что-то пропустил в запросах Тем не менее, я надеюсь, что вы понимаете общую идею.

1 голос
/ 10 июля 2019

Далее возвращается список тележек со всеми тремя объектами:

select cart_id
from t
where object_id in (18, 10, 21)
group by cart_id
having count(distinct cart_id) = 3;
0 голосов
/ 10 июля 2019
select group_concat(`app_item`.`object_id`) as `combination`  
from `app_item`
group by `app_item`.`cart_id`

enter image description here

Запрос возвращает "комбинированный" набор результатов, который я искал:

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

enter image description here

и теперь я могу отображать массив в виде ключа / пары, например «комбинация» => «число вхождений», как показано ниже

enter image description here

...