簡體   English   中英

MySQL查詢-查找同類客戶購買的產品

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM