[英]MySQL query - find products purchased by similar customers
假設我們有一個由兩個字段組成的“訂單”表——客戶和客戶購買的產品。
CREATE TABLE orders (customer VARCHAR(16) NOT NULL, product_id INT NOT NULL);
如果類似客戶被定義為至少購買了兩種相同產品的客戶。 我想知道如何通過查詢獲得每個客戶的相似客戶購買的產品。 (注意客戶自己購買的產品除外)。
輸入:
INSERT INTO orders VALUES
('A', 1), ('A', 2), ('A', 3),
('B', 1), ('B', 2), ('B', 4),
('C', 1), ('C', 3), ('C', 4), ('C', 5);
理想output:
|customer|product_id|
|---|---|
|'A'| 4 |
|'A'| 5 |
|'B'| 3 |
|'B'| 5 |
|'C'| 2 |
例如,客戶 A 和客戶 B 都購買了產品 1 和產品 2,因此他們是相似的客戶。 因此,產品 4 是客戶 A 的類似客戶購買的產品,因此它被列出。 我可以通過以下代碼獲得類似的客戶,但不知道如何進行:
WITH common AS (
SELECT o1.customer AS cust_1, o2.customer AS cust_2, o1.product_id AS prod_id,
COUNT(*) OVER (PARTITION BY o1.customer, o2.customer) AS same_purchased
FROM orders o1 JOIN orders o2
ON (o1.customer < o2.customer AND o1.product_id = o2.product_id))
SELECT cust_1, cust_2, prod_id
FROM common WHERE same_purchased >= 2
SQL 小提琴: https://dbfiddle.uk/S6X7gCJH
這里 SQL 不言自明:
WITH similars as (
SELECT
c1.customer,
c2.customer as similar
from
orders c1
inner join orders c2 on c1.customer != c2.customer
and c1.product_id = c2.product_id
group by
c1.customer,
c2.customer
having
count(*) > 1
)
select
distinct s.customer,
o.product_id
from
similars s
inner join orders o on o.customer = s.similar
where
o.product_id not in (
select
product_id
from
orders
where
customer = s.customer
)
order by
s.customer,
o.product_id
結果
梅爾 | product_id |
---|---|
一個 | 4 |
一個 | 5 |
乙 | 3 |
乙 | 5 |
C | 2 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.