mysql - 通过带有联接或分组依据的 SQL 请求返​​回过去

标签 mysql sql join group-by

我正在处理旧数据库,我必须基于旧数据库创建新列。这是一个日志表,每一行都是一个事件。因此,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_idMAX。但我不熟悉这些类型的连接。

这是我的示例数据集:

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/

相关文章:

mysql - 如何使用sql查询计算 Crystal 报表中的行总和,并且如果总和等于0.00则不显示

mysql - Node.js - 我可以在 PhoneGap/Cordova 应用程序上安装 NPM 包吗?

python - 使用通配符的复杂和自定义 SQL 连接条件

java - Hibernate中如何连接多个表?

mysql - 使用 Wampserver 安装 WordPress 时出现““Can’ t 选择数据库”错误

mysql - 这不是一个数字 Phpmyadmin

mysql - 对列求和或新列

sql - 在 SQL 中获取一列按另一列分组时的 SUM

mysql - 是否可以删除不使用的 ID?

android - DISTINCT 与 RANDOM() 排序