Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

tính toán hầu hết người dùng từng trực tuyến với MySQL

Bạn có thể sử dụng các biến MySQL để tính toán tổng số khách truy cập hiện đang được ghi nhật ký đang chạy và sau đó nhận được giá trị tối đa:

SET @logged := 0;
SET @max := 0;

SELECT 
     idLoginLog, type, time,
    (@logged := @logged + IF(type, 1, -1)) as logged_users,
    (@max := GREATEST(@max, @logged))
FROM logs
ORDER BY time;

SELECT @max AS max_users_ever;

( SQL Fiddle )

Chỉnh sửa: Tôi cũng có một gợi ý về cách đối phó với người dùng không đăng xuất rõ ràng. Giả sử bạn coi một người dùng tự động đăng xuất sau 30 phút:

SET @logged := 0;
SET @max := 0;

SELECT 
     -- Same as before
     idLoginLog, type, time,
    (@logged := @logged + IF(type, 1, -1)) AS logged_users,
    (@max := GREATEST(@max, @logged)) AS max_users
FROM ( -- Select from union of logs and records added for users not explicitely logged-out
  SELECT * from logs
  UNION
  SELECT 0 AS idLoginnLog, l1.username, ADDTIME(l1.time, '0:30:0') AS time, 0 AS type
  FROM -- Join condition matches log-out records in l2 matching a log-in record in l1
    logs AS l1
    LEFT JOIN logs AS l2
    ON (l1.username=l2.username AND l2.type=0 AND l2.time BETWEEN l1.time AND ADDTIME(l1.time, '0:30:0'))
  WHERE
    l1.type=1
    AND l2.idLoginLog IS NULL -- This leaves only records which do not have a matching log-out record
) AS extended_logs 
ORDER BY time;

SELECT @max AS max_users_ever;

( Fiddle )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn MySQL để cập nhật bản ghi với ngày tăng dần

  2. SQLAlchemy - Lấy danh sách các bảng

  3. Làm thế nào để tạo trình khởi tạo để tạo và di chuyển cơ sở dữ liệu mysql?

  4. Thuật toán tạo lịch trình hiệu quả trong SQL

  5. Gặp sự cố khi tạo bảng tạm thời ngoài UNION