如何编写SQL语句实现按集合轮询展示所有产品?
实现产品集合的轮询排序展示
嘿,要实现不同集合的产品轮询展示,核心就是给每个集合里的产品标记一个「组内序号」,然后按这个序号来分组排序,就能达到依次从每个集合取一个产品的效果啦!
问题分析
你现有的SQL只是关联了表并查询数据,但没有处理排序逻辑,所以只能按集合分组展示。要实现轮询,我们需要给每个集合内的产品按顺序编号,然后先按这个编号排序,再按集合排序,这样同编号的产品会凑在一起,也就是每个集合的第N个产品会排在同一批次。
解决方案SQL
基于你现有的语句,我们可以通过ROW_NUMBER()窗口函数来实现:
SELECT ps.product_id, ps.set_id, ps.`order`, -- 按集合分区,给每个集合内的产品按order字段排序并分配序号 ROW_NUMBER() OVER (PARTITION BY ps.set_id ORDER BY ps.`order`) AS group_row_num FROM product_set ps INNER JOIN sets s ON ps.set_id = s.id WHERE `condition` = true -- 先按组内序号排序,再按集合ID排序,实现轮询效果 ORDER BY group_row_num, ps.set_id;
效果说明
- 每个集合里的产品会被分配一个从1开始的序号(比如Set01的Product01是1,Product02是2;Set02的Product06是1,Product07是2)
- 排序时先按
group_row_num升序,这样所有序号为1的产品(每个集合的第一个)会先展示,然后是序号为2的,以此类推,完美实现轮询 - 如果某个集合的产品数量比其他多,当其他集合没有对应序号的产品时,这个集合的剩余产品会继续依次展示(比如Set03有5个产品,当序号到4时,Set01和Set02已经没有产品了,就会连续显示Set03的Product14、15)
可选优化
如果你的集合有指定的展示顺序(比如希望固定按Set01→Set02→Set03的轮询顺序),可以在ORDER BY里把ps.set_id换成集合表的排序字段(比如s.display_order),这样轮询的集合顺序会更符合你的需求。
内容的提问来源于stack exchange,提问作者whoacowboy
相关产品推荐
相关产品推荐

