SQL 获取上一个订单的状态
时间:2022-07-24
本文章向大家介绍SQL 获取上一个订单的状态,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述
有一个订单表 t_order,有关 t_order 的描述见下表。
字段 |
类型 |
描述 |
---|---|---|
id |
Integer |
主键 |
create_ts |
Datetime |
创建时间 |
uid |
Integer |
用户ID |
is_suc |
Integer |
订单状态 1-成功 0-失败 |
t_order 的数据如下:
id create_ts uid is_suc
------ ------------------- ------ --------
1 2020-01-01 11:21:24 1 1
2 2020-01-02 20:41:10 1 0
3 2020-01-03 8:12:14 1 0
4 2020-01-04 22:50:24 2 1
5 2020-01-05 6:39:45 1 0
6 2020-01-06 19:10:51 2 0
7 2020-01-07 14:12:40 1 1
8 2020-01-08 17:12:10 2 1
9 2020-01-09 23:22:52 1 0
10 2020-01-10 5:10:28 2 0
现在要做的是在 t_order 表中增加一列 last_id,用于展示上一个状态为“成功”的订单的 id,若找不到符合条件的订单,则 last_id 为 NULL
。
最终要实现的结果如下:
id create_ts uid is_suc last_id
------ ------------------- ------ ------ ---------
1 2020-01-01 11:21:24 1 1 (NULL)
2 2020-01-02 20:41:10 1 0 1
3 2020-01-03 8:12:14 1 0 1
4 2020-01-04 22:50:24 2 1 (NULL)
5 2020-01-05 6:39:45 1 0 1
6 2020-01-06 19:10:51 2 0 4
7 2020-01-07 14:12:40 1 1 1
8 2020-01-08 17:12:10 2 1 4
9 2020-01-09 23:22:52 1 0 7
10 2020-01-10 5:10:28 2 0 8
解决方案
需要明确的是,相对于当前订单的“上一个订单”是依据创建时间来选择,而不是主键。
暂时假设 t_order 中每个用户的订单的创建时间对应着主键单调递增,那我们就可以说最靠近当前订单的创建时间的记录就是要锁定的上一个订单。
要得到当前订单的上一个状态为“成功”的订单,可使用下面的 SQL 获取:
SELECT
MAX(id)
FROM
t_order
WHERE is_suc = 1
AND uid = 当前订单的所属用户
AND create_ts < 当前订单的创建时间
完整的 SQL 如下:
SELECT
*,
(SELECT
MAX(id)
FROM
t_order
WHERE is_suc = 1
AND uid = a.uid
AND create_ts < a.create_ts ) AS last_id
FROM
t_order a
我们前面做了一个假设,假设每个用户的订单的创建时间是随着主键递增的,但有时候并不是这样。有的订单的创建得比较早,但是进入到数据库比较晚,因此就会出现在两条订单记录中,ID 较小的记录的创建时间比 ID 大的记录的创建时间还要晚的情况。如果是这种情况,就不能应用上面的 SQL 。
可以先筛选出小于当前订单的创建时间的所有记录,重新排序后只取创建时间最大的那条记录。
用 SQL 来表示:
SELECT
id
FROM
t_order
WHERE is_suc = 1
AND uid = 当前订单的所属用户
AND create_ts < 当前订单的创建时间
ORDER BY create_ts DESC
LIMIT 1
完整的 SQL:
SELECT
*,
(SELECT
id
FROM
t_order
WHERE is_suc = 1
AND uid = a.uid
AND create_ts < a.create_ts
ORDER BY create_ts DESC
LIMIT 1) AS last_id
FROM
t_order a
- 树上倍增求LCA及例题
- 深度强化学习-DDPG算法原理和实现
- 你绝对想不到,数据地图还能这么玩~
- TensorFlow从0到1 - 17 - Step By Step上手TensorBoard
- 深度强化学习-Actor-Critic算法原理和实现
- 深度强化学习-Policy Gradient基本实现
- TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑
- 买卖股票算法题的后续!
- 一个例子教你如何与出题人斗智斗勇
- 用数据来聊聊国产电影~
- 如何买卖股票?不要慌,我有妙招!
- 2017.11.7解题报告
- TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
- 让priority_queue支持小根堆的几种方法
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解