常見需求:依據分類統計文章數量與不重複發文使用者數。本文以 Discuz!/UCenter Home 風格資料表為例,示範 LEFT JOIN + GROUP BY + 聚合函數的標準寫法。
-- 文章表 pre_home_blog
-- 欄位:blogid, uid, username, catid, status, ...
-- 分類表 pre_home_blog_category
-- 欄位:catid, catname, ...
SELECT
b.catname AS '分類名稱',
COUNT(*) AS '日誌數',
COUNT(DISTINCT a.username) AS '參與人數'
FROM `pre_home_blog` a
LEFT JOIN `pre_home_blog_category` b ON a.catid = b.catid
WHERE a.status = 0 -- 僅統計正常發布狀態
GROUP BY b.catid, b.catname
ORDER BY '日誌數' DESC;
LEFT JOIN:保留無分類文章(catid=0 或 NULL),分類名稱顯示為 NULL。COUNT(*):統計該分類下文章總筆數。COUNT(DISTINCT a.username):去重統計發文使用者數,避免同一用戶多篇文章重複計算。GROUP BY b.catid, b.catname:依分類聚合;某些 SQL 引擎要求 SELECT 非聚合欄位必須出現在 GROUP BY 中。| 分類名稱 | 日誌數 | 參與人數 |
|---|---|---|
| 生活隨筆 | 152 | 45 |
| 技術分享 | 98 | 32 |
| 心情日記 | 67 | 28 |
| (無分類) | 12 | 8 |
AND a.dateline BETWEEN '2024-01-01' AND '2024-12-31'AND a.uid IN (SELECT uid FROM ...)WITH ROLLUP 產生總計列。此查詢模式廣泛適用於「主表 + 維度表」的分群統計場景,如商品分類銷售統計、部門員工績效統計等。