返回顶部
首页 > 资讯 > 数据库 >mysql如何通过当前排序字段获取相邻数据项
  • 209
分享到

mysql如何通过当前排序字段获取相邻数据项

2024-04-02 19:04:59 209人浏览 泡泡鱼
摘要

目录通过当前排序字段获取相邻数据项1.业务场景2.思路3.sql同表相邻数据查询或计算用户下相邻订单的时间差举例通过当前排序字段获取相邻数据项 1.业务场景 (1)需要专门以一个弹窗

通过当前排序字段获取相邻数据项

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进行降序排序,然后得到通过‘,’连接的两条数据的时间,如下:2017-07-27 01:27:22,2017-07-21 09:43:02
  • 使用SUBSTRING_INDEX函数通过’,'将数据拆分再拿到第一条数据,也就是第二笔订单的时间了;
  • 利用unix_timestamp对created_at作差,得到两笔订单的时间间隔;

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

您可能感兴趣的文档:

--结束END--

本文标题: mysql如何通过当前排序字段获取相邻数据项

本文链接: https://lsjlt.com/news/148243.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql如何通过当前排序字段获取相邻数据项
    目录通过当前排序字段获取相邻数据项1.业务场景2.思路3.sql同表相邻数据查询或计算用户下相邻订单的时间差举例通过当前排序字段获取相邻数据项 1.业务场景 (1)需要专门以一个弹窗...
    99+
    2024-04-02
  • MySql如何获取相邻数据
    目录如何获取相邻数据同表相邻数据比对查询需求SQL解析最终SQL如何获取相邻数据 因为项目,所以找到了一些资料并且总结了下关于获取相邻数据的方式。 我只找到了以下的... SEL...
    99+
    2024-04-02
  • oracle如何根据字段分组排序取其第一条数据
    这篇文章主要介绍“oracle如何根据字段分组排序取其第一条数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“oracle如何根据字段分组排序取其第一条数据”文章能帮助大家解决问题。以某个字段分组 ...
    99+
    2023-07-05
  • 小程序如何获取第三方平台自定义的数据字段
    本文将为大家详细介绍“小程序如何获取第三方平台自定义的数据字段”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“小程序如何获取第三方平台自定义的数据字段”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体...
    99+
    2023-06-26
  • 微信小程序如何获取第三方平台自定义的数据字段
    这篇文章主要介绍了微信小程序如何获取第三方平台自定义的数据字段的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序如何获取第三方平台自定义的数据字段文章都会有所收获,下面我们一起来看看吧。wx.getExt...
    99+
    2023-06-26
  • 如何通过索引优化PHP与MySQL的数据排序和数据分组的效率?
    在开发Web应用过程中,经常需要对数据进行排序和分组操作。而对于PHP与MySQL之间的数据排序和数据分组操作,我们可以通过索引来优化其效率。索引是一种数据结构,用于提高数据的检索速度。它可以加快数据的排序、分组以及查找操作。下面我们将介绍...
    99+
    2023-10-21
    MySQL PHP 索引优化 数据分组 数据排序
  • 小程序如何获取第三方平台自定义数据字段的同步接口
    这篇“小程序如何获取第三方平台自定义数据字段的同步接口”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序如何获取第三方平台自定义数据字段的同步接口”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,...
    99+
    2023-06-26
  • 如何通过索引优化PHP与MySQL的计算字段和JSON数据的查询?
    引言:在PHP和MySQL开发中,经常会涉及到计算字段和JSON数据的查询需求。然而,由于这两种查询都会带来较高的计算量和数据处理复杂度,如果不加以优化,可能会导致性能下降。本文将介绍如何通过索引优化PHP与MySQL的计算字段和JSON数...
    99+
    2023-10-21
    MySQL PHP 索引优化
  • 【MySQL】 如何在MySQL中获取表中的某个字段为最大值和倒数第二条的整条数据?
    文章目录 前言一、查询倒数第二个记录1.1、使用排名1.2、子查询1.3、嵌套查询 二、下面为大家提供一个测试案例三、查询某个字段为最大值的整条数据3.1、使用max3.2、使用连接3.3...
    99+
    2023-10-27
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作