首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 多表 COUNT 統計優化:單條 SQL 實現多表數據聚合

     編輯:MySQL 資料庫相關知識

一、 業務場景與痛點

在開發成就系統時,經常需要統計用戶多維度的數據指標,例如:粉絲數達 50 解鎖「名揚四海」稱號、點贊數達 100 獲得「點贊聖手」稱號等。這些數據分散在不同表中——粉絲數存於 user_relation,點贊數存於 user_praise,系統涉及多達 12 張統計表。

傳統做法是分別執行多條 SQL 查詢,再在應用層組裝結果:

SELECT count(*) mysh FROM user_relation WHERE other_uid = 123456;
SELECT count(*) dzss FROM user_praise WHERE praise_uid = 123456;

當統計表增多時,不僅代碼冗餘,資料庫連接開銷也顯著增加,急需優化方案。

二、 UNION ALL + SUM:單條 SQL 解決多表統計

利用 UNION ALL 將多表查詢結果合併,再配合 SUM() 聚合,即可在單條語句中完成多表計數:

SELECT SUM(wrzm) wrzm, SUM(mysh) mysh, SUM(sgbh) sgbh
FROM (
    SELECT COUNT(*) wrzm, 0 mysh, 0 sgbh FROM user_witness WHERE plan_uid = 123456
    UNION ALL
    SELECT 0 wrzm, COUNT(*) mysh, 0 sgbh FROM user_relation WHERE other_uid = 123456
    UNION ALL
    SELECT 0 wrzm, 0 mysh, COUNT(*) sgbh FROM plan_stage WHERE uid = 123456 AND status = 1
) t;

執行結果將三行數據壓縮為一行,完美滿足單用戶多維度統計需求。

三、 擴展至全量用戶統計

若需統計 user_info 中所有用戶,只需在子查詢加入 GROUP BY,外層再按 uid 聚合:

SELECT uid, SUM(wrzm) wrzm, SUM(mysh) mysh, SUM(sgbh) sgbh
FROM (
    SELECT plan_uid uid, COUNT(*) wrzm, 0 mysh, 0 sgbh FROM user_witness GROUP BY plan_uid
    UNION ALL
    SELECT other_uid uid, 0 wrzm, COUNT(*) mysh, 0 sgbh FROM user_relation GROUP BY other_uid
    UNION ALL
    SELECT uid, 0 wrzm, 0 mysh, COUNT(*) sgbh FROM plan_stage WHERE status = 1 GROUP BY uid
) t GROUP BY uid;

後續可直接追加 WHERE uid = 123456 過濾單用戶,或 ORDER BY 排序,靈活性極高。

四、 總結

通過 UNION ALL 縱向合併多表結果,再用 SUM() 橫向聚合,僅需一次資料庫交互即可完成多表計數,大幅降低查詢延遲與應用層複雜度。此模式適用於所有「多表同維度聚合」場景,值得收藏備用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved