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

SQL 進階:單條語句統計登入日誌每用戶登入次數

     編輯:MySQL 綜合教學

SQL 進階:單條語句統計登入日誌每用戶登入次數

這是資料分析的基礎操作,掌握 GROUP BY 聚合查詢是後端開發與數據分析師的必備技能。

核心 SQL

SELECT user_name, COUNT(*) AS login_count
FROM login_log
GROUP BY user_name;

進階變體

1. 篩選高頻用戶(HAVING 子句)

SELECT user_name, COUNT(*) AS login_count
FROM login_log
GROUP BY user_name
HAVING login_count > 10;  -- 僅顯示登入超過 10 次的用戶

注意: HAVING 用於聚合後過濾,WHERE 用於聚合前過濾。

2. 多維度統計

-- 按用戶 + 日期統計
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;

3. 統計最近 N 天

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;

4. 關聯用戶主表獲取詳細資訊

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) 或移除時間欄位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved