MySQL按字母顺序查询前后记录,实现企业详情页上下导航
嘿,这个需求在企业详情页里太常见啦!我给你整理了两种最常用的解决方案,适配不同的排序场景:
方案1:按企业名称的字典序获取上下家
从你的例子来看,上下家是按名称的字典顺序(C→D→E)排列的,那咱们就基于名称字段来查询:
步骤1:先获取当前企业的名称(可选,也可以用子查询直接关联)
你已经知道当前企业ID是4,名称是D,不过如果想动态适配任意ID,可以先查名称:
SELECT name FROM sample WHERE id = 4;
步骤2:查询上一家企业(名称小于D的最大值)
找比当前名称小的所有企业里,名称排序最靠后的那个:
SELECT * FROM sample WHERE name < 'D' ORDER BY name DESC LIMIT 1;
步骤3:查询下一家企业(名称大于D的最小值)
找比当前名称大的所有企业里,名称排序最靠前的那个:
SELECT * FROM sample WHERE name > 'D' ORDER BY name ASC LIMIT 1;
进阶写法:用子查询一步到位
不想单独查当前名称的话,直接嵌套子查询,这样不管当前ID是多少都能通用:
-- 上一家 SELECT * FROM sample WHERE name < (SELECT name FROM sample WHERE id = 4) ORDER BY name DESC LIMIT 1; -- 下一家 SELECT * FROM sample WHERE name > (SELECT name FROM sample WHERE id = 4) ORDER BY name ASC LIMIT 1;
方案2:按企业ID的顺序获取上下家(如果ID是自增且和展示顺序一致)
如果你的企业是按ID自增插入的,且上下家的顺序就是ID的先后顺序,那这个写法更简单高效:
-- 上一家(ID小于4的最大ID) SELECT * FROM sample WHERE id < 4 ORDER BY id DESC LIMIT 1; -- 下一家(ID大于4的最小ID) SELECT * FROM sample WHERE id > 4 ORDER BY id ASC LIMIT 1;
注意事项
- 边界处理:如果当前企业是列表的第一条,上一家查询会返回空;如果是最后一条,下一家查询返回空。前端展示时要判断这种情况,比如隐藏对应的跳转按钮。
- 自定义排序:如果你的上下家是按其他字段排序(比如创建时间、注册日期),只需要把
name字段换成对应的字段就行,逻辑完全一样。比如按create_time排序:
-- 上一家(创建时间早于当前的最新记录) SELECT * FROM sample WHERE create_time < (SELECT create_time FROM sample WHERE id = 4) ORDER BY create_time DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者Meldin Xavier
相关产品推荐
相关产品推荐

