我正在处理旧数据库,我必须基于旧数据库创建新列。这是一个日志表,每一行都是一个事件。因此,uid
是一个用户 ID,用户可以发出多个验证请求。
这是我的 table
event_id uid event
1 1 REQUEST
2 1 VALIDATION
3 2 REQUEST
4 3 REQUEST
5 3 VALIDATION
6 2 VALIDATION
7 1 REQUEST
8 1 VALIDATION
这就是我想要的
event_id uid event last_event_id request_nb
1 1 REQUEST 8 1
2 1 VALIDATION 8 1
3 2 REQUEST 6 1
4 3 REQUEST 5 1
5 3 VALIDATION 5 1
6 2 VALIDATION 6 1
7 1 REQUEST 8 2
8 1 VALIDATION 8 2
我假设我需要在 uid
上进行 group by
,类似于 1 + SUM(CASE WHEN EVENT = 'VALIDATION' THEN 1 ELSE 0 END ) AS request_nb
。还有 last_event_id
的 MAX
。但我不熟悉这些类型的连接。
这是我的示例数据集:
CREATE TABLE IF NOT EXISTS `docs` (
`event_id` int(6) unsigned NOT NULL,
`uid` int(3) unsigned NOT NULL,
`event` varchar(200) NOT NULL,
PRIMARY KEY (`event_id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`event_id`, `uid`, `event`) VALUES
('1', '1', 'REQUEST'),
('2', '1', 'VALIDATION'),
('3', '2', 'REQUEST'),
('4', '3', 'REQUEST'),
('5', '3', 'VALIDATION'),
('6', '2', 'VALIDATION'),
('7', '1', 'REQUEST'),
('8', '1', 'VALIDATION');
和同样的 fiddle :http://sqlfiddle.com/#!9/404dcf/1
有人有想法吗?
谢谢!
最佳答案
例如:
SELECT a.event_id
, a.uid
, a.event
, a.i
, b.last_event_id
FROM
( SELECT x.*
, CASE WHEN @prev_uid = uid THEN CASE WHEN @prev_event = event THEN @i:=@i+1 ELSE @i:=1 END ELSE @i:=1 END i
, @prev_uid := uid prev_uid
, @prev_event := event prev_event FROM docs x
, (SELECT @prev_uid := null, @prev_event := null, @i:=1) vars
ORDER
BY uid
, event
, event_id
) a
JOIN
( SELECT uid, MAX(event_id) last_event_id FROM docs GROUP BY uid ) b
ON b.uid = a.uid
ORDER
BY a.event_id;
关于mysql - 通过带有联接或分组依据的 SQL 请求返回过去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572122/