mysql如何通过当前排序字段获取相邻数据项
作者:遥?寄 发布时间:2024-01-13 02:24:25
通过当前排序字段获取相邻数据项
1.业务场景
(1)需要专门以一个弹窗页面展示一项数据的所有字段值.其中一些字段值长度较大。
(2)能够左右切换上一项下一项数据
(3)存在可排序的字段,如以id进行排序
2.思路
2.1 sql
1>查询前一项,查询小于当前id的项逆序取第一个
2>查询后一项,查询大于当前id的项正序取第一个
3>连接两项结果
2.2 页面逻辑
(1)在展示当前项时获取好两相邻的数据,在做切换时直接填充数据
(2)切换数据展示时同样再次获取当前项两相邻数据
以此(1)(2)往复
3.sql
例:查询id为40两相邻的数据
( SELECT * FROM [表名] WHERE id < 40 ORDER BY id DESC LIMIT 1 ) UNION
(
SELECT
*
FROM
[表名]
WHERE
id > 40
ORDER BY
id
LIMIT 1
)
同表相邻数据查询或计算
用户下相邻订单的时间差举例
这里主要介绍一下,在一张数据表下对相邻的数据进行一个相关查询和计算;
拿一个在电商中最常见的情况,计算一下用户首单和第二单的时间间隔这样的数据来举例,如下:
id | customer_id | created_at |
---|---|---|
1 | 1 | 2017-07-21 09:43:02 |
2 | 12 | 2017-07-25 11:37:48 |
3 | 10 | 2017-07-25 11:43:41 |
4 | 1 | 2017-07-27 01:27:22 |
5 | 10 | 2017-07-27 07:46:45 |
6 | 1 | 2017-07-27 10:21:37 |
7 | 12 | 2017-07-27 13:26:19 |
查询用户首单和第二单的时间间隔:
SELECT
m.customer_id,
sfo.created_at as '首单时间',
m.created_at as '第二单时间',
(unix_timestamp(m.created_at) - unix_timestamp(sfo.created_at))/86400 as '两单相差天数'
FROM
sales_flat_order m
LEFT JOIN
sales_flat_order sfo on m.customer_id = sfo.customer_id and sfo.created_at < m.created_at
WHERE
(
SELECT
count(*)
FROM
sales_flat_order n
WHERE
m.customer_id = n.customer_id
AND m.created_at > n.created_at
) = 1
GROUP BY m.customer_id
查询结果是:
customer_id | 首单时间 | 第二单时间 | 两单时间差 |
---|---|---|---|
1 | 2017-07-21 09:43:02 | 2017-07-27 01:27:22 | 5.6558 |
12 | 2017-07-25 11:37:48 | 2017-07-27 13:26:19 | 2.0754 |
10 | 2017-07-25 11:43:41 | 2017-07-27 07:46:45 | 1.8355 |
整个原理如下:
将一张表查询两次得到两组数据,分别为别名m和别名n的两组数据;
以m为主,用n的数据和m的数据作对比,通过created_at的判断过滤掉一些无用数据;
使用count()函数统计满足条件的数据个数;
统计数为1时说明n表中比m表中时间小的只有1条,m中的该条数据也就是该用户下的第二笔订单;
通过LEFT JOIN联表,通过created_at找到比第二单更早的一单也就是用户的首单;
利用unix_timestamp把得到的两条数据的created_at做差,得到了两笔订单的时间间隔;
下面做了一下拓展,可以查询任意相连的两笔订单的时间间隔:
SELECT
m.customer_id,
m.created_at as '后一单时间',
SUBSTRING_INDEX(
GROUP_CONCAT(sfo.created_at ORDER BY sfo.created_at DESC),
',',
1
) as '前一单时间',
(unix_timestamp(m.created_at) - unix_timestamp(
SUBSTRING_INDEX(
GROUP_CONCAT(sfo.created_at ORDER BY sfo.created_at DESC),
',',
1
)
))/86400 as '两单相差天数'
FROM
sales_flat_order m
LEFT JOIN
sales_flat_order sfo on m.customer_id = sfo.customer_id and sfo.created_at < m.created_at
WHERE
(
SELECT
count(*)
FROM
sales_flat_order n
WHERE
m.customer_id = n.customer_id
AND m.created_at > n.created_at
) = 2
GROUP BY m.customer_id;
得到数据如下:
customer_id | 后一单时间 | 前一单时间 | 两单时间差 |
---|---|---|---|
1 | 2017-07-27 10:21:37 | 2017-07-27 01:27:22 | 0.3710 |
这里判断的是统计数为2的,也就是用户的第二单和第三单的时间间隔计算,因为用户10和12只有两单所以结果中无这两个用户;
整个原理如下:
将一张表查询两次得到两组数据,分别为别名m和别名n的两组数据;
以m为主,用n的数据和m的数据作对比,通过created_at的判断过滤掉一些无用数据;
使用count()函数统计满足条件的数据个数;
筛选之后m中得到的是第三笔订单;
通过LEFT JOIN联表,通过created_at找到比第三笔订单时间早的订单,这里会从sfo中得到两笔订单;
利用GROUP_CONCAT函数每组订单中各得到的两笔订单利用created_at进行降序排序,然后得到通过‘,’连接的两条数据的时间,如下:2017-07-27 01:27:22,2017-07-21 09:43:02
使用SUBSTRING_INDEX函数通过’,'将数据拆分再拿到第一条数据,也就是第二笔订单的时间了;
利用unix_timestamp对created_at作差,得到两笔订单的时间间隔;
这只是我想到的应对这种场景通过SQL语句进行查询的方法。
来源:https://blog.csdn.net/qq_44308920/article/details/122594378


猜你喜欢
- 1、首先停止正在运行的MySQL进程 Linux下,运行 killall -TERM mysqld Windows下,如果写成服务的 可以运
- 本来想等到IE8正式发布时再在blog中写段代码,用来提示IE6用户升级到IE8的,不过貌似IE 8已经RTM了,今天又正好看到这个“升级I
- 今天想用python做个demo,含两个子图的动态gif,代码如下:import matplotlib.pyplot as pltimpor
- 首先配置好你的MariaDb,创建test数据库,在test里创建MyTable表,脚本如下(通过HeidiSQL导出的脚本):-- ---
- Python类的动态修改的实例方法相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不
- 1、开启Mysql慢查询1.1、查看慢查询相关配置show variables like 'slow_query_log%'
- 一、整体合并团队协作中,开发人员A、B、C分别在dev上进行功能开发,并push代码到远端dev上。当测试人员需要对功能进行测试的时候,我们
- 实例如下所示:from pandas import *from random import *df = DataFrame(columns=
- 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在。在这里使用一个cache存放已
- python保存图片时和原图大小一致之前遇到过一次这个问题,当时解决了但是忘了记录,这里再记录一次好了。1. matplotlib系列的整体
- 拷贝副本复制一个二叉树副本,广度优先遍历同时设置两个队列,一个遍历一个复制创建。func Copy(bt *biTree) *biTree
- Go 语言教程Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Robert Griesemer,
- 随着 CSS3 渐入人心,Web 字体逐渐成为话题,这种即将让未来的 Web 更加丰富多彩的技术(或者说标准)拥有多种可能,虽然 .webf
- 本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作。分享给大家供大家参考,具体如下:实现一个功能: &n
- ObjectUtil组件其实就是单例模式的最好范例,声明调用各个组件的时候,用ObjectUtil调用,可以有效的防止调用过多的类而导致错误
- 前言最近实习任务为黑烟检测,想起了可以尝试用yolov5来跑下,之前一直都是用的RCNN系列,这次就试试yolo系列。一、安装pytorch
- SQL Server 2000 清理日志精品教程SQL Server 2000 数据库日志太大!如何清理SQL Server 2000的日志
- 本文为大家分享了Linux环境下mysql5.6.24自动安装脚本代码,供大家参考,具体内容如下说明:一、本脚本仅供测试使用,若正式环境想要
- openCV是基于C++开发的一个强大的图像处理库。在用C++处理图像或视频时通常会使用到openCV这个库,但是这个库并非C++中的标准库
- 一、什么是"非构造函数"的继承?比如,现在有一个对象,叫做"中国人"。var Chinese = {