我想对表中的所有行进行排序,循环中每个类别一个。例如,给定以下数据:
+---------+-------------+
| item_id | category_id |
+---------+-------------+
| 4013738 | 1102 |
| 4016142 | 1102 |
| 4027380 | 1102 |
| 4029166 | 1014 |
| 4031335 | 1125 |
| 4031984 | 1014 |
| 4031986 | 1014 |
| 5034654 | 1123 |
| 5034656 | 1125 |
| 5034662 | 1125 |
| 5034735 | 1109 |
| 5034736 | 1109 |
| 5034737 | 1109 |
| 5040226 | 1123 |
| 5040227 | 1123 |
+---------+-------------+
所需的结果集应该是这样的:
+---------+-------------+
| item_id | category_id |
+---------+-------------+
| 4029166 | 1014 |
| 4013738 | 1102 |
| 5034735 | 1109 |
| 5034654 | 1123 |
| 4031335 | 1125 |
| 4031984 | 1014 |
| 4016142 | 1102 |
| 5034736 | 1109 |
| 5040226 | 1123 |
| 5034656 | 1125 |
| 4031986 | 1014 |
| 4027380 | 1102 |
| 5034737 | 1109 |
| 5040227 | 1123 |
| 5034662 | 1125 |
+---------+-------------+
item_id
还应订购连续类别。如果某些类别包含的项目比其他类别多,则循环应继续使用相同的逻辑处理剩下的任何行。
在像 php 这样的脚本语言中,这将是一项相当微不足道的任务,但我无法终生思考如何在 sql 中完成它。
这是一个带有示例数据的数据库小提琴:https ://www.db-fiddle.com/f/ioZzvoQfnSNiowe6Rp7QP5/0
使用类别作为窗口,我在该窗口中给行一个数字,然后我用它来对所有行进行排序。通过这种方式,我获得了在其类别中排在第一位的所有行,然后是排在第二位的所有行,以此类推。请注意,我没有按 item_id 订购,所以这可能不是您所需要的,但它应该能让您继续前进。
见dbfiddle