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

MySQLでのユーザーデータの操作

    スキーマ

    CREATE TABLE log
    ( user_id int, request_timestamp datetime);
    
    INSERT INTO log
    VALUES
    (1, '2014-10-26 10:51:18'), (1, '2014-10-26 10:52:20'), (1, '2014-10-26 11:15:03'), (1, '2014-10-26 11:39:18'), (1, '2014-10-26 15:01:18'), (1, '2014-10-26 15:01:21'), (1, '2014-10-27 21:22:19'),
    (2, '2014-10-15 12:19:01'), (2, '2014-10-15 12:19:12'), (2, '2014-10-15 12:19:45'), (2, '2014-10-15 12:20:03'), (2, '2014-10-17 14:55:13'), (2, '2014-10-17 14:55:19'),(2, '2014-10-17 14:55:22');
    

    まず、視覚化するために次の名前を付けます。

    1800の下に注意してください 30分*60秒/分を意味します

    Specimen A
    -----  
    select l.user_id,l.request_timestamp,
    @sessionnum := 
    if((@curuser = user_id and TIME_TO_SEC(TIMEDIFF(request_timestamp,@theDt))>1800),@sessionnum + 1, 
    if(@curuser <> user_id,1,@sessionnum))  as sessionnum,
    @curuser := user_id as v_curuser,
    @theDt:=request_timestamp as v_theDt
    from log l cross join
    (select @curuser := '', @sessionnum := 0,@theDt:='') gibberish
    order by l.user_id,l.request_timestamp
    +---------+---------------------+------------+-----------+---------------------+
    | user_id | request_timestamp   | sessionnum | v_curuser | v_theDt             |
    +---------+---------------------+------------+-----------+---------------------+
    |       1 | 2014-10-26 10:51:18 | 1          |         1 | 2014-10-26 10:51:18 |
    |       1 | 2014-10-26 10:52:20 | 1          |         1 | 2014-10-26 10:52:20 |
    |       1 | 2014-10-26 11:15:03 | 1          |         1 | 2014-10-26 11:15:03 |
    |       1 | 2014-10-26 11:39:18 | 1          |         1 | 2014-10-26 11:39:18 |
    |       1 | 2014-10-26 15:01:18 | 2          |         1 | 2014-10-26 15:01:18 |
    |       1 | 2014-10-26 15:01:21 | 2          |         1 | 2014-10-26 15:01:21 |
    |       1 | 2014-10-27 21:22:19 | 3          |         1 | 2014-10-27 21:22:19 |
    |       2 | 2014-10-15 12:19:01 | 1          |         2 | 2014-10-15 12:19:01 |
    |       2 | 2014-10-15 12:19:12 | 1          |         2 | 2014-10-15 12:19:12 |
    |       2 | 2014-10-15 12:19:45 | 1          |         2 | 2014-10-15 12:19:45 |
    |       2 | 2014-10-15 12:20:03 | 1          |         2 | 2014-10-15 12:20:03 |
    |       2 | 2014-10-17 14:55:13 | 2          |         2 | 2014-10-17 14:55:13 |
    |       2 | 2014-10-17 14:55:19 | 2          |         2 | 2014-10-17 14:55:19 |
    |       2 | 2014-10-17 14:55:22 | 2          |         2 | 2014-10-17 14:55:22 |
    +---------+---------------------+------------+-----------+---------------------+
    

    その後、必要に応じて完了です。ただし、きれいな印刷の場合 、Specimen Aをラップできます 別の内部:

    select user_id,request_timestamp,sessionnum
    from
    (   select l.user_id,l.request_timestamp,
        @sessionnum := 
        if((@curuser = user_id and TIME_TO_SEC(TIMEDIFF(request_timestamp,@theDt))>1800),@sessionnum + 1, 
        if(@curuser <> user_id,1,@sessionnum))  as sessionnum,
        @curuser := user_id as v_curuser,
        @theDt:=request_timestamp as v_theDt
        from log l cross join
        (select @curuser := '', @sessionnum := 0,@theDt:='') gibberish
        order by l.user_id,l.request_timestamp
    ) SpecimenA
    order by user_id,sessionnum
    +---------+---------------------+------------+
    | user_id | request_timestamp   | sessionnum |
    +---------+---------------------+------------+
    |       1 | 2014-10-26 10:51:18 | 1          |
    |       1 | 2014-10-26 10:52:20 | 1          |
    |       1 | 2014-10-26 11:15:03 | 1          |
    |       1 | 2014-10-26 11:39:18 | 1          |
    |       1 | 2014-10-26 15:01:18 | 2          |
    |       1 | 2014-10-26 15:01:21 | 2          |
    |       1 | 2014-10-27 21:22:19 | 3          |
    |       2 | 2014-10-15 12:19:01 | 1          |
    |       2 | 2014-10-15 12:19:12 | 1          |
    |       2 | 2014-10-15 12:19:45 | 1          |
    |       2 | 2014-10-15 12:20:03 | 1          |
    |       2 | 2014-10-17 14:55:13 | 2          |
    |       2 | 2014-10-17 14:55:19 | 2          |
    |       2 | 2014-10-17 14:55:22 | 2          |
    +---------+---------------------+------------+
    14 rows in set (0.02 sec)
    

    OPのセッションの定義に注意してください。これは非アクティブの1つです 、期間ではありません。



    1. 大きなMySqlテーブルの重複を削除します

    2. MySQLクエリのテーブルと列を引用符で囲む必要がありますか?

    3. 月と年のみに基づいてmySQLを選択します

    4. MySQLで複数の値を更新する