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
)

同表相邻数据查询或计算

用户下相邻订单的时间差举例

这里主要介绍一下,在一张数据表下对相邻的数据进行一个相关查询和计算;

拿一个在电商中最常见的情况,计算一下用户首单和第二单的时间间隔这样的数据来举例,如下:

idcustomer_idcreated_at
112017-07-21 09:43:02
2122017-07-25 11:37:48
3102017-07-25 11:43:41
412017-07-27 01:27:22
5102017-07-27 07:46:45
612017-07-27 10:21:37
7122017-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首单时间第二单时间两单时间差
12017-07-21 09:43:022017-07-27 01:27:225.6558
122017-07-25 11:37:482017-07-27 13:26:192.0754
102017-07-25 11:43:412017-07-27 07:46:451.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后一单时间前一单时间两单时间差
12017-07-27 10:21:372017-07-27 01:27:220.3710

这里判断的是统计数为2的,也就是用户的第二单和第三单的时间间隔计算,因为用户10和12只有两单所以结果中无这两个用户;

整个原理如下:

  • 将一张表查询两次得到两组数据,分别为别名m和别名n的两组数据;

  • 以m为主,用n的数据和m的数据作对比,通过created_at的判断过滤掉一些无用数据;

  • 使用count()函数统计满足条件的数据个数;

  • 筛选之后m中得到的是第三笔订单;

  • 通过LEFT JOIN联表,通过created_at找到比第三笔订单时间早的订单,这里会从sfo中得到两笔订单;

  • 利用GROUP_CONCAT函数每组订单中各得到的两笔订单利用created_at进行降序排序,然后得到通过&lsquo;,&rsquo;连接的两条数据的时间,如下:2017-07-27 01:27:22,2017-07-21 09:43:02

  • 使用SUBSTRING_INDEX函数通过&rsquo;,'将数据拆分再拿到第一条数据,也就是第二笔订单的时间了;

  • 利用unix_timestamp对created_at作差,得到两笔订单的时间间隔;

这只是我想到的应对这种场景通过SQL语句进行查询的方法。 

来源:https://blog.csdn.net/qq_44308920/article/details/122594378

标签:mysql,排序字段,相邻数据
0
投稿

猜你喜欢

  • Appium中scroll和drag_and_drop根据元素位置滑动

    2023-03-16 23:34:38
  • MAC系统IDEA颜值插件MaterialThemeUI

    2022-12-26 00:29:07
  • 如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱

    2022-07-03 20:51:47
  • 解密ThinkPHP3.1.2版本之独立分组功能应用

    2023-11-20 09:06:02
  • Python Pygame实战之打地鼠小游戏

    2022-01-04 11:16:35
  • XML的简单读取与写入

    2008-09-04 10:35:00
  • javascript 使用sleep函数的常见方法详解

    2024-04-22 13:00:08
  • python实现计算器小功能

    2022-07-15 04:33:56
  • asp dictionary对象的用法

    2011-04-14 11:09:00
  • Python3结合Dlib实现人脸识别和剪切

    2023-01-10 01:28:48
  • 简单介绍Python的Tornado框架中的协程异步实现原理

    2021-06-21 10:00:23
  • MySQL 查询 并集、交集、差集方式

    2024-01-18 11:34:36
  • 利用Javascript判断操作系统的类型实现不同操作系统下的兼容性

    2024-02-27 00:00:25
  • python调试神器PySnooper的使用

    2021-08-28 23:25:49
  • mysql获取字符串长度函数(CHAR_LENGTH)

    2024-01-26 02:42:51
  • MySQL查询冗余索引和未使用过的索引操作

    2024-01-22 22:04:23
  • Javascript语法检查插件 jsLint for Vim

    2009-03-11 16:37:00
  • JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果

    2024-04-10 10:50:20
  • python实现剪贴板的操作

    2021-09-06 08:46:16
  • python实现布隆过滤器及原理解析

    2023-03-11 15:01:20
  • asp之家 网络编程 m.aspxhome.com