mysql实现不使用limit查询第x条到第y条的数据

本文介绍了一种在MySQL中不使用LIMIT实现特定范围数据查询的方法,通过自定义一个自增变量并结合子查询和连接查询,实现了从任意起始位置获取指定数量记录的功能。

mysql实现不使用limit查询第x条到第y条的数据


废话不多说直接上代码

SET @rownum = 0;
SELECT
	* 
FROM
	emp a
	INNER JOIN (  SELECT ( @rownum := @rownum + 1 ) ids, emp_id AS id  
												FROM emp ) AS b 
    ON a.emp_id = b.id 
HAVING
	ids BETWEEN 10 AND 20

实际上就是自定义一个自增的变量作为一个字段,通过子查询查出两个字段,一个是自增的变量,一个是原表的主键,通过连接查询以主键为查询条件。就能得出原表的所有数据和一个从1开始有序的列。这样就可以通过having来查询筛选需要的数据。不能用where ,where会报错。

可能就有人会问了,为什么使用limit就能简单实现的功能还需要这么多此一举??

其实是因为有一次面试,面试官问了我这个问题。当时问的我一脸懵逼啊!!
当时场面就一度很尴尬-- 我面试完就百度。。结果发现百度不到!!!!然后我又问了一些前辈,前辈给出了一个思路。于是就花了点时间将这个功能实现了出来。
如果有什么更好的方法,欢迎大家在下面留言~

### 如何在 MySQL 中通过时间字段对记录进行排序并限制结果为前 100 要在 MySQL 数据库中按照时间字段对记录进行排序,并仅获前 100 记录,可以使用 `ORDER BY` 和 `LIMIT` 子句组合来实现。以下是具体的 SQL 查询语法: ```sql SELECT * FROM table_name WHERE is_del = 0 ORDER BY time_field DESC LIMIT 100; ``` 上述查询表示从表 `table_name` 中选未被删除 (`is_del = 0`) 的所有列数据,按时间字段 `time_field` 进行降序排列(最新时间为先),最后只前 100 记录[^1]。 #### 关于性能优化注意事项 如果直接使用 `LIMIT` 配合较大的偏移量(如 `LIMIT 1000000, 10`),这会导致数据库扫描大量无用的数据从而降低性能[^3]。因此建议采用如下方式改进分页查询效率: - **利用索引覆盖**:确保所涉及的时间字段已建立合适的索引; - **基于主键范围查询替代 OFFSET**:例如上一次请求最后一项ID为X,则下一次加载更多可改为`WHERE id > X ORDER BY id ASC LIMIT Y`; 另外需要注意的是,在某些情况下即使SQL语句看似正确却仍可能出现重复或者错乱现象,这是因为缺乏唯一性约束所致[^5]。为了防止此类情况发生应该始终保证至少存在一个稳定变的依据用于区分每一独立记录比如添加额外的一级或多级排序件直至能够完全决定顺序为止。 ```python def generate_query(table_name, time_column): sql_template = f""" SELECT * FROM {table_name} WHERE is_del = 0 ORDER BY {time_column} DESC LIMIT 100; """ return sql_template.strip() print(generate_query('statistic', 'yesterday_earnings')) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值