如何从30万行数据表筛选指定行?间隔行查询SQL报错求解
解答你的两个SQL问题
1. 从30万行数据表中选择指定n行
根据不同的需求场景,有几种实用的实现方式:
- 按顺序获取前n行:如果需要按某个字段排序后取前n条记录,
LIMIT是最高效的方式:SELECT * FROM monitor ORDER BY `time` LIMIT 100; -- 将100替换成你需要的n值 - 随机抽取n行:如果需要随机选n条数据,可以用
RAND(),但30万行数据量下,这个方法性能会稍弱,小数据量可以放心使用:
大数据量场景下,推荐用基于主键的随机范围查询来提升性能:SELECT * FROM monitor ORDER BY RAND() LIMIT 100;SELECT * FROM monitor WHERE id >= FLOOR(RAND() * (SELECT MAX(id) FROM monitor)) LIMIT 100; - 从指定位置开始取n行:如果要跳过前m行再取n行,用
LIMIT m, n(m是偏移量,从0开始计数):SELECT * FROM monitor ORDER BY `time` LIMIT 5000, 100; -- 跳过前5000行,取100行
2. 解决"每隔4行取一行"的语法错误问题
你的报错主要有两个原因:一是使用的MariaDB版本低于10.2.0,这个版本之前的MariaDB不支持ROW_NUMBER()这类窗口函数;二是报错信息里子查询用了FROM mytable,但你的实际数据表是monitor,表名不一致也会导致问题。
给你两种解决方案:
方案1:用用户变量模拟行号(兼容低版本)
如果无法升级数据库,用用户变量生成行号来实现需求:
SELECT t.id, t.time FROM ( SELECT id, `time`, @rownum := @rownum + 1 AS rownum FROM monitor, (SELECT @rownum := 0) AS init_var ORDER BY `time` ) AS t -- 条件可按需调整: -- %5 = 1 表示取第1、6、11...行(每隔4行取第一行) -- %5 = 0 表示取第5、10、15...行(每隔4行取最后一行) WHERE t.rownum % 5 = 1 ORDER BY t.time;
原理:通过@rownum变量初始化后逐行递增,生成连续行号,再通过模运算筛选符合间隔要求的行。
方案2:升级后使用窗口函数(推荐高版本)
如果能将MariaDB升级到10.2.0及以上版本,修正表名后你的原语句就可以正常运行,比如:
SELECT t.id, t.time FROM ( SELECT id, `time`, ROW_NUMBER() OVER (ORDER BY `time`) AS rownum FROM monitor ) AS t WHERE t.rownum % 5 = 1 ORDER BY t.time;
(同样,%5 =1对应每隔4行取一行,可根据实际需求调整模运算参数)
内容的提问来源于stack exchange,提问作者executable
相关产品推荐
相关产品推荐

