sql >> データベース >  >> RDS >> Mysql

MySQLを使用してオンラインでこれまでにほとんどのユーザーを計算する

    MySQL変数を使用して、現在ログに記録されている訪問者の現在の合計を計算し、最大値を取得できます。

    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

    編集: 明示的にログアウトしていないユーザーに対処する方法についても提案があります。ユーザーが30分後に自動的にログアウトしたと考えてください:

    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;
    

    フィドル



    1. SQLServerで月の最初の日を取得する3つの方法

    2. Postgresql列挙型の長所と短所は何ですか?

    3. SQL ServerのFLOOR()の例

    4. MySQL LEFTJOIN3テーブル