java-zh 2024-10-22 18:52 采纳率: 80%
浏览 7
已结题

mysql分页排序问题

目前有一张表A,现在需要对表A进行分页排序


```sql
CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `num` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;


```sql
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (1, '北京', 2);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (2, '上海', 3);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (3, '深圳', 3);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (4, '广州', 5);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (5, '佛山', 6);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (6, '杭州', 3);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (7, '丽水', 3);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (8, '温州', 3);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (9, '金华', 2);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (10, '衢州', 1);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (11, '淄博', 6);
INSERT INTO `yshopb2c`.`a` (`id`, `name`, `num`) VALUES (12, '天津', 3);


排序前的数据

img

问题点:现在需要对这个十二条数据进行分页排序,每页一展示4条数据,但是每页内容都需要至少包含num值为3的2条数据,并且3排在对前面

想要的效果
第一页
上海 3
深圳 3
北京 2
广州 5
第二页
杭州 3
丽水 3
金华 2
佛山 6
第三页
温州 3
天津 3
衢州 1
淄博 6

  • 写回答

2条回答 默认 最新

  • QyDDLz 2024-10-25 10:40
    关注

    为了实现你描述的要求,你可以使用MySQL的LIMITOFFSET以及ORDER BY结合子查询来达到分页并优先显示num值为3的记录。这里是一个示例SQL查询,按照num降序排列,并保证每页开始有两条num为3的记录,然后按照name升序排列:

    SELECT * 
    FROM (
      SELECT a.*,
             ROW_NUMBER() OVER(PARTITION BY num ORDER BY name ASC) as row_num
      FROM yshopb2c.a
      WHERE num = 3 OR (num = 2 AND row_num <= 2)
    ) subquery
    ORDER BY num DESC, name ASC
    LIMIT 4 OFFSET ((@page - 1) * 4) /* 假设 @page 是当前页码 */
    

    请注意,这里假设你有一个变量@page存储当前页码,通常这需要从用户输入或其他程序环境获取。每次增加OFFSET的数量时(这里是4),就会向前移动到下一页。

    如果你是在SQL Developer环境中,你可以在查询编辑器里直接输入这个查询,然后动态地更新@page的值以查看不同的页面。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月6日
  • 已采纳回答 10月29日
  • 创建了问题 10月22日