在获取父对象数据的 API 调用中使用条件生成器时,我遇到了获取重复记录的问题。
场景:获取所有parent_obj值,按child_obj.name和parent_obj.description排序
查询1:
select parent_obj.id, ..
from parent_obj
inner join child_obj on parent_obj.id = child_obj.id
where 1=1
group by parent_obj.id, child_obj.name
order by child_obj.name asc, parent_obj.description asc
limit 15 offset 15;
查询2:
select parent_obj.id, ..
from parent_obj
inner join child_obj on parent_obj.id = child_obj.id
where 1=1
group by parent_obj.id, child_obj.name
order by child_obj.name asc, parent_obj.description asc
limit 15 offset 30;
在 Query1 返回中,值包含 id 的 15 条记录为 16、17 到 30。下一个 Query2 返回,接下来的 15 条记录,但记录包含 重复值,如 16 和 17 在列表中。
注意:如果我从查询中删除
order by
,我可以从parent_obj 中获取不同的值。
获取parent_obj.id的数据库结果:
查询1:
id1_2_ | name | description
--------+-----------------+--------------
1638 | Adidas | Nvbnbvn
1624 | Adidas | Nvbnbvn
1623 | Adidas | Nvbnbvn at
1636 | Adidas | Sddsfdsfdsfd
1647 | Adidas | Sdfsdf
1504 | Adidas | Sdfsdv
1508 | Adidas | Shirt
1661 | Adidas | Trainers
1537 | Adidas | Trainers
1646 | Adidas | Ttdhd
1500 | Adidas | Yellow wear
1651 | Avec les filles | Hgfhgjyg
1657 | BUFFALO | Hmgmhgjjh
1652 | BUFFALO | Hmgmhgjjh
1656 | BUFFALO | Hmgmhgjjh
(15 rows)
查询2:
id1_2_ | name | description
--------+----------+----------------------
1655 | BUFFALO | Hmgmhgjjh
1654 | BUFFALO | Hmgmhgjjh
1652 | BUFFALO | Hmgmhgjjh
1656 | BUFFALO | Hmgmhgjjh
484 | BURBERRY | Classic Camel
483 | BURBERRY | Red Check Scarf
542 | CASTAÑER | Lurex Frayed Wedges
504 | Chanel | Polarized Sunglasses
533 | CHLOÉ | Faye Shoulder Bag
534 | CHLOÉ | Guipure Dress
535 | CHLOÉ | Rubie Sunglasses
536 | CHLOÉ | Sonnie Sneaker
537 | CHLOÉ | Susanna Boots
1373 | CLUSE | La Boheme Mesh
469 | DIOR | Dior Color Quake 1
(15 rows)
以上结果包含 1652 和 1656 的 id,它们具有相同的名称和相同的描述。
我该如何解决这个问题?
问题是您没有在排序中包含所有分组依据列。 因此,您得到的行无法通过排序来区分,即它们各自的顺序取决于数据库选择的访问路径并且本质上是随机的。
这会导致行包含在多个页面中,并且可能根本不包含其他行。
为了解决此问题,请将 group by 子句的所有列都显示在 order by 子句中,例如添加末尾未包含的列。