首页 > 数据库 >PostgreSQL排序字段不唯一导致分页查询结果出现重复数据

PostgreSQL排序字段不唯一导致分页查询结果出现重复数据

时间:2023-09-24 20:55:24浏览次数:67  
标签:aa 12 PostgreSQL page 字段 tsopd 排序 order select

背景

pg单字段排序,排序字段中可能会出现重复,这样就会导致我们在进行分页查询时会出现一些和预期不相符的现象,如这个数据在第一页出现了,然后再第二页又出现。

复现步骤

create table test_select_order_page_duplicate
(
id varchar(36) not null
constraint test_select_order_page_duplicate_pk
primary key,
name varchar,
age integer
);

alter table test_select_order_page_duplicate owner to postgres;


insert
into test_select_order_page_duplicate
( id, name, age )
values
( '1111', 'aa', 12 ),
( '2222', 'aa', 12 ),
( '3333', 'aa', 12 ),
( '4444', 'aa', 12 ),
( '5555', 'aa', 13 ),
( '6666', 'aa', 12 ),
( '7777', 'aa', 12 ),
( '8888', 'aa', 13 ),
( '9999', 'aa', 12 ),
( '10101010', 'aa', 12 ),
( '11111111', 'aa', 14 ),
( '12121212', 'aa', 14 ),
( '13131313', 'aa', 12 );

查询第一页

select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age
limit 3;
idnameage
2222 aa 12
3333 aa 12
1111 aa 12

查询第二页

select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age
limit 3 offset 3;
idnameage
2222 aa 12
6666 aa 12
7777 aa 12


可以明显看到,两次分页查询出现了同一条id为2222的记录,但实际上数据库里只有一条2222,查询结果莫名出现了重复数据。

解决方式

核心思路就是让order by拥有唯一性。

具体解决方式就是,补充一个有唯一约束或者大概率唯一的字段作为次级排序条件。

例如,补充主键作为排序条件:

select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age, tsopd.id desc

预防

n对1关系的连表查询时,如果根据1端表的字段排序就肯定要加一个n端的id

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17726636.htmll

标签:aa,12,PostgreSQL,page,字段,tsopd,排序,order,select
From: https://www.cnblogs.com/lingyejun/p/17726636.html

相关文章

  • 排序算法
    排序算法哪些是稳定的排序算法,哪些是不稳定的稳定的:直接插入排序:最坏情况是逆序,时间复杂度是O(N^2^),最好情况是插入的都是顺序,时间复杂度O(N),空间复杂度O(1)冒泡排序:时间复杂度O(N^2^),空间复杂度O(1)计数排序:时间复杂度O(N+Range),空间复杂度O(range)不稳定:希尔排序:时间复杂......
  • es 编写查询DSL,查询user_name字段不为空的文档
    内容来自对chatgpt的咨询我们可以使用exists查询来检查user_name字段是否存在且包含非空值:{"query":{"bool":{"must":{"exists":{"field":"user_name"......
  • yum安装postgresql-14
    PostgreSQL:Linuxdownloads(RedHatfamily)sudoyuminstall-yhttps://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm#InstallPostgreSQL:sudoyuminstall-ypostgresql14-server#Optionallyinitializet......
  • 33. 搜索旋转排序数组
    整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.length)上进行了 旋转,使数组变为 [nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标 从0开始 计数)。例如, [0,1,2,4,5,6,7] 在......
  • JavaScript实现排序算法
    目录前言排序算法冒泡排序选择排序插入排序归并排序快速排序计数排序基数排序桶排序前言排序算法是《数据结构与算法》中最基本的算法之一,本篇使用JavaScript语言实现各种常见排序算法。排序算法冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻......
  • C 排序
    贪心做好优化,否者超时对于第一位a,它只可能替换成a-1,所以如果在a到a-1的数字内只有a或者a-2,那么a-1就可以取代a。因此我们可以开10个数组来存储每个数字的下标,对于每一位从0开始贪心的枚举每一位,如果有满足的j,那么直接替换,肯定有一个j满足要求(因为它自己肯定满足)。代码里有一......
  • 算法基础之快速排序
    quick_sort方法中如果i=l,j=r会死循环的分析示例代码voidquick_sort(inta[],intl,intr){if(l>=r)return;inti=l,j=r;//此处设置会导致死循环intx=num[(l+r)>>1];while(i<j){while(a[++i]<x);//死循环的地方while(a[--j]>x......
  • 【Java 基础篇】Java 自然排序:使用 Comparable 接口详解
    在Java编程中,我们经常需要对对象进行排序。为了实现排序,Java提供了java.lang.Comparable接口,它允许我们定义对象之间的自然顺序。本篇博客将深入探讨如何使用Comparable接口来进行自然排序,包括接口的基本概念、使用示例以及一些常见问题的解决方法。什么是自然排序?自然排序......
  • 【Java 基础篇】Java 比较器排序:精通自定义对象排序
    在Java编程中,排序是一个非常常见且重要的操作。Java提供了多种排序机制,其中之一就是使用比较器(Comparator)进行排序。比较器允许您自定义对象的排序方式,使您能够实现各种排序需求,从简单的对象排序到复杂的多属性排序。本篇博客将从入门到高级,详细介绍Java比较器排序的使用。什......
  • 漏洞修复系列-如何升级linux系统Upgrade to PostgreSQL JDBC Driver version 42.2.27,
    问题遇到一个PostgreSQLJDBCDriver漏洞PostgreSQLJDBCDriverthatis42.2.xpriorto42.2.27,42.3.xpriorto42.3.8,42.4.xpriorto42.4.3or42.5.xpriorto42.5.1.Itis,therefore,affectedbyaninformationdisclosurevulnerability.原因PostgreSQLJD......