Как проверить, имеет ли столбец набор значений в SQL - PullRequest
0 голосов
/ 04 марта 2020
+------------+-------------+
| product_id | customer_id |
+------------+-------------+
|          2 |           1 |
|          4 |           1 |
|          1 |           1 |
|          6 |           1 |
|          2 |           2 |
|          5 |           3 |
|          8 |           4 |
|          1 |           4 |
|          7 |           4 |
|          9 |           4 |
|          5 |           4 |
|         10 |           5 |
|          1 |           6 |
|          2 |           6 |
|          3 |           6 |
|          4 |           6 |
|          5 |           6 |
|          6 |           6 |
|          7 |           6 |
|          8 |           6 |
|          9 |           6 |
|         10 |           6 |
|          1 |           8 |
+------------+-------------+

У меня есть таблица, как показано выше. Я хочу знать, есть ли у клиента конкретный customer_id набор product_ids (скажем, 1,2,3,4,5,6,7,8). Как мне этого добиться? Допустим, имя таблицы - CustProds. Для простоты предположим, что это единственная таблица в БД, и они имеют ограничение не ноль. Ожидаемый результат -

+------------+-------------+
| product_id | customer_id |
+------------+-------------+
|          1 |           6 |
|          2 |           6 |
|          3 |           6 |
|          4 |           6 |
|          5 |           6 |
|          6 |           6 |
|          7 |           6 |
|          8 |           6 |
|          9 |           6 |
|         10 |           6 |
+------------+-------------+

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Не зная вашей СУБД, трудно точно ответить. Например, в Oracle SQL вы можете сделать что-то вроде этого:

SELECT c.product_id,
       m.customer_id
FROM (
    SELECT t.customer_id,
           COUNT(*)
    FROM CustProds t
    WHERE t.product_id IN (1,2,3,4,5,6,7,8) /* List of items to find */
    GROUP BY t.customer_id
    HAVING COUNT(DISTINCT t.product_id) = 8 /* Number of items in list */
) m
JOIN CustProds c
     ON c.customer_id = m.customer_id
ORDER BY m.customer_id, c.product_id
0 голосов
/ 04 марта 2020

Вы можете получить результаты в одной строке для каждого клиента как:

SELECT cp.customer_id, GROUP_CONCAT(cp.product_id) as product_ids
FROM CustProds cp
GROUP BY cp.customer_id
HAVING SUM(cp.product_id IN (1, 2, 3, 4, 5, 6, 7, 8)) = 8;

Это предполагает, что таблица не имеет дубликатов, хотя ее можно легко настроить для обработки этой ситуации.

...