首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 實現關聯訂單統計:收貨人/地址任一匹配即關聯,關聯超 3 筆輸出用戶 ID

     編輯:MySQL 綜合教學

需求描述

訂單表字段:rec_p(收貨人)、rec_addr(收貨地址)、order_no(訂單號)、user_id(用戶 ID)。
規則:任意兩訂單的 收貨人相同 或 地址相同 即視為關聯訂單。
目標:找出關聯訂單數 > 3 的記錄,輸出對應 user_id 列表。

測試數據

CREATE TABLE order_table (
    rec_p VARCHAR(20),
    rec_addr VARCHAR(100),
    order_no VARCHAR(20),
    user_id VARCHAR(20)
);
INSERT INTO order_table VALUES
('張三','北京','1001','1'),
('張四','上海','1002','2'),
('張五','北京','1003','1'),
('張六','廣州','1004','3'),
('張三','深圳','1005','1'),
('張七','上海','1006','4');

SQL 實現

SELECT a.*
FROM order_table a
JOIN (
    SELECT rec_p, COUNT(*) AS pnum FROM order_table GROUP BY rec_p
) a1 ON a.rec_p = a1.rec_p
JOIN (
    SELECT rec_addr, COUNT(*) AS addrnum FROM order_table GROUP BY rec_addr
) a2 ON a.rec_addr = a2.rec_addr
WHERE (a1.pnum + a2.addrnum) > 3;

邏輯解析

  • 子查詢 a1 統計每個收貨人出現次數。
  • 子查詢 a2 統計每個地址出現次數。
  • 主查詢 JOIN 兩統計表,若 pnum + addrnum > 3 則該訂單關聯度超標。
  • 輸出滿足條件的完整訂單行(含 user_id)。

結果預期

張三出現 2 次,北京出現 2 次,合計 4 > 3 → 訂單 1001、1005 輸出。
北京地址關聯訂單 1001、1003,張三關聯 1001、1005,合併去重後關聯訂單數滿足條件。

擴展建議

  • 若需去重 user_id:SELECT DISTINCT user_id FROM (...) t。
  • 大數據量建議建立 rec_p、rec_addr 索引,或用臨時表分步統計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved