mysql通用的查找当前数据的上一条下一条数据

背景
应项目需要,需要在返回当前页信息时返回它的上一页和下一页信息的id,于是就有了这篇文章。
思路
通过主键id进行比较

方法一:
上一条:
select * from table_a where id = (select id from table_name where id < {$id} order by id desc limit 1);   
下一条:
select * from table_a where id = (select id from table_name where id > {$id} order by id asc limit 1); 
方法二:
上一条:
select * from table_name where id = (select max(id) from table_a where id < {$id});   
下一条:
select * from table_name where id = (select min(id) from table_a where id > {$id});  

很显然思路一句有很强的局限性,一旦数据有其他的排序条件,则起不了作用了,因此并不是通用的。
经过一上午的努力,想到了给数据编号的形式,如下:

正解

上一条:
SELECT
	m.id
FROM
	(
	SELECT
		( @i := @i + 1 ) AS RowNum,
		A.* 
	FROM
		table_name A,
		( SELECT @i := 0 ) B 
	WHERE
		具体条件
	ORDER BY
		具体排序方式
	) m,
	(
	SELECT
		D.id,D.RowNum as n2
	FROM
		(
		SELECT
			( @j := @j + 1 ) AS RowNum,
			A.* 
		FROM
			table_name A,
			( SELECT @j := 0 ) B 
		WHERE
			具体条件
		ORDER BY
			具体排序方式
		) D 
	WHERE
		D.id = 11 
	) q 
WHERE
	m.RowNum < q.n2 
	 limit  1
SELECT
	m.id
FROM
	(
	SELECT
		( @i := @i + 1 ) AS RowNum,
		A.* 
	FROM
		table_name A,
		( SELECT @i := 0 ) B 
	WHERE
		具体条件
	ORDER BY
		具体排序方式
	) m,
	(
	SELECT
		D.id,D.RowNum as n2
	FROM
		(
		SELECT
			( @j := @j + 1 ) AS RowNum,
			A.* 
		FROM
			table_name A,
			( SELECT @j := 0 ) B 
		WHERE
			具体条件
		ORDER BY
			具体排序方式
		) D 
	WHERE
		D.id = 11 
	) q 
WHERE
	m.RowNum < q.n2 
	order by m.RowNum desc
 limit 1

注意:

  1. table_name 改为自己的表名
  2. 具体条件和排序方式自己加上,而且条件和排序方式得是同一个
  3. 注意B表中需要重新定义变量j,不能在用i, 因为在同一个sql中i会继续增,导致出问题
  4. 查询下一条的sql需要加上order by m.RowNum desc ,因为取的是一条,要是没有逆序排的话,会找到最小的,当然也可以用Max函数。
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MySQL查找重复数据并只保留一条,你可以使用以下方法: 1. 使用GROUP BY和HAVING子句:可以通过将列名包含在GROUP BY子句中,并使用HAVING COUNT(*)>1来筛选出重复数据。然后,可以使用DELETE语句删除重复数据,但只保留一行。 2. 使用临时表:可以创建一个临时表,将重复数据插入临时表中,然后使用DELETE语句删除原始表中的重复数据。最后,可以将临时表中的数据重新插入到原始表中,以保留唯一性。 举例来说,假设你有一个名为table_name的表,并且你想要删除其中的重复数据,只保留一行。你可以使用以下SQL语句: 方法1: ``` DELETE FROM table_name WHERE column_name NOT IN ( SELECT MIN(column_name) FROM table_name GROUP BY column_name HAVING COUNT(*)>1 ); ``` 方法2: ``` CREATE TABLE temp_table AS SELECT * FROM table_name WHERE column_name IN ( SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(*)>1 ); DELETE FROM table_name WHERE column_name IN ( SELECT column_name FROM temp_table ); INSERT INTO table_name SELECT * FROM temp_table; DROP TABLE temp_table; ``` 请注意替换table_name和column_name为你实际使用的表名和列名。 这样,你就可以在MySQL查找重复数据并只保留一条。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)](https://download.csdn.net/download/weixin_38736760/14835809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统-机器学习算法应用(含Python源码)+数据集](https://download.csdn.net/download/qq_31136513/88285126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值