在開發成就系統時,經常需要統計用戶多維度的數據指標,例如:粉絲數達 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() 聚合,即可在單條語句中完成多表計數:
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() 橫向聚合,僅需一次資料庫交互即可完成多表計數,大幅降低查詢延遲與應用層複雜度。此模式適用於所有「多表同維度聚合」場景,值得收藏備用。