已知当前值时,如何在MySQL中获取数据表的上下记录?
在MySQL 8.0.19中获取当前记录的上/下一条记录
首先明确:数据库表中的记录没有天然的顺序,必须指定排序规则才能定义「上一条」和「下一条」。以下基于你提供的字段,给出两种实用方案,你可根据业务需求调整排序依据。
方案1:按id排序(适用于id可作为顺序标识的场景)
假设你已知当前记录的id = current_id、parentID = current_parentID、appID = current_appID,如果需要限定同parentID和appID下的记录,可使用以下查询:
获取上一条记录(比当前id小的最大id对应的记录)
SELECT * FROM your_table WHERE parentID = current_parentID AND appID = current_appID AND id < current_id ORDER BY id DESC LIMIT 1;
获取下一条记录(比当前id大的最小id对应的记录)
SELECT * FROM your_table WHERE parentID = current_parentID AND appID = current_appID AND id > current_id ORDER BY id ASC LIMIT 1;
若无需限定parentID和appID,直接去掉对应WHERE条件即可。
方案2:按Name字典序排序(适用于id无法作为顺序标识的场景)
假设当前记录的Name = current_name,同样可限定parentID和appID:
获取上一条记录(字典序小于当前Name的最后一条记录)
SELECT * FROM your_table WHERE parentID = current_parentID AND appID = current_appID AND Name < current_name ORDER BY Name DESC LIMIT 1;
获取下一条记录(字典序大于当前Name的第一条记录)
SELECT * FROM your_table WHERE parentID = current_parentID AND appID = current_appID AND Name > current_name ORDER BY Name ASC LIMIT 1;
一次获取上/下两条记录
通过UNION ALL合并两个查询,可一次性拿到结果:
(SELECT * FROM your_table WHERE parentID = current_parentID AND appID = current_appID AND id < current_id ORDER BY id DESC LIMIT 1) UNION ALL (SELECT * FROM your_table WHERE parentID = current_parentID AND appID = current_appID AND id > current_id ORDER BY id ASC LIMIT 1);
性能优化建议
为避免全表扫描、提升查询速度,建议创建对应联合索引:
- 若用
id排序:
CREATE INDEX idx_parent_app_id ON your_table(parentID, appID, id);
- 若用
Name排序:
CREATE INDEX idx_parent_app_name ON your_table(parentID, appID, Name);
内容的提问来源于stack exchange,提问作者HJP22
相关产品推荐
相关产品推荐

