如何使用OFFSET实现唯一ProductId关联订单的分页查询
按唯一ProductId分页获取全部关联订单的实现方案
要实现按唯一ProductId分页(每页返回指定数量的不同ProductId对应的所有订单),核心是先对ProductId的唯一集合做分页,再关联订单表获取全量数据,而非直接对关联后的订单行分页。
具体实现步骤
- 先筛选出所有唯一的
ProductId,对这个集合执行分页逻辑,拿到当前页需要的ProductId列表 - 用该列表关联
Order表,获取这些ProductId对应的全部订单记录
SQL示例(以SQL Server为例)
假设每页需要返回5个唯一ProductId:
WITH PaginatedProducts AS ( -- 第一步:对唯一ProductId分页,拿到当前页的5个目标ProductId SELECT DISTINCT ProductId FROM [Order] ORDER BY ProductId OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY -- 注:OFFSET后的数值为(页码-1)*每页数量,比如第2页就写OFFSET 5 ROWS ) -- 第二步:关联订单表,获取目标ProductId的所有订单 SELECT o.* FROM [Order] o JOIN PaginatedProducts pp ON o.ProductId = pp.ProductId ORDER BY o.ProductId, o.CreatedDate; -- 可选:按ProductId和订单创建时间排序
为什么之前的方法不生效?
直接对关联后的订单行使用OFFSET FETCH,是对单条行数据分页,会导致同一个ProductId的订单被截断(比如某个ProductId有3个订单,分页取5行时可能只返回这个ProductId的3个订单加另一个的2个,最终仅得到2个唯一ProductId)。而先对唯一ProductId集合分页再关联,能确保拿到完整的指定数量的ProductId对应的所有订单。
扩展:关联Product表获取商品信息
如果需要同时返回Product表的名称等字段,只需在最后关联Product表即可:
WITH PaginatedProducts AS ( SELECT DISTINCT ProductId FROM [Order] ORDER BY ProductId OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY ) SELECT o.*, p.Name AS ProductName FROM [Order] o JOIN PaginatedProducts pp ON o.ProductId = pp.ProductId JOIN Product p ON o.ProductId = p.Id ORDER BY o.ProductId, o.CreatedDate;
内容的提问来源于stack exchange,提问作者Marsh
相关产品推荐
相关产品推荐

