sql >> Databáze >  >> RDS >> Mysql

Manipulace s uživatelskými daty v MySQL

Schéma

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');

Nejprve dáme následující jméno, abychom si to představili:

Poznámka pod 1800 znamená 30 min * 60 sek/minutu

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 |
+---------+---------------------+------------+-----------+---------------------+

Pak máme hotovo, jestli chcete. Ale pro pěkný tisk , může zabalit Specimen A uvnitř jiného:

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)

Všimněte si definice relace OP. Jedná se o nečinnost , nikoli trvání.



  1. MySQL; Nejlepší datový typ pro velká čísla

  2. Jak převést z varbinary na char/varchar v mysql

  3. řazení podle XXX řazení podle ASC nebo DESC , dynamické řazení, mysql...

  4. Paralelní prováděcí plány – větve a vlákna