這是資料分析的基礎操作,掌握 GROUP BY 聚合查詢是後端開發與數據分析師的必備技能。
SELECT user_name, COUNT(*) AS login_count
FROM login_log
GROUP BY user_name;
SELECT user_name, COUNT(*) AS login_count
FROM login_log
GROUP BY user_name
HAVING login_count > 10; -- 僅顯示登入超過 10 次的用戶
注意: HAVING 用於聚合後過濾,WHERE 用於聚合前過濾。
-- 按用戶 + 日期統計
SELECT user_name, DATE(login_time) AS login_date, COUNT(*) AS cnt
FROM login_log
GROUP BY user_name, DATE(login_time)
ORDER BY login_date DESC, cnt DESC;
SELECT user_name, COUNT(*) AS login_count
FROM login_log
WHERE login_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY user_name
ORDER BY login_count DESC;
SELECT u.id, u.real_name, u.email, COUNT(l.id) AS login_count
FROM users u
LEFT JOIN login_log l ON u.id = l.user_id
GROUP BY u.id, u.real_name, u.email
ORDER BY login_count DESC;
user_name 或 user_id 建立普通索引Summary Table 定時預聚合SELECT *,僅選取必要欄位| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
SELECT user_name, COUNT(*) FROM login_log | 缺少 GROUP BY,報錯 | 加上 GROUP BY user_name |
WHERE COUNT(*) > 10 | 聚合函數不能用於 WHERE | 改用 HAVING COUNT(*) > 10 |
GROUP BY user_name, login_time | 按時間分組導致每筆獨立 | 使用 DATE(login_time) 或移除時間欄位 |