如何按唯一parent_id限制SQL查询结果,获取含5个唯一父ID的排序数据
问题与解决方案
问题描述
现有一张包含id、score、parent_id列的表,数据已按score降序排序,原始数据如下:
| id | score | parent_id |
|---|---|---|
| 5859 | 10 | 5859 |
| 2157043 | 9 | 5859 |
| 21064154 | 8 | 21064154 |
| 51992 | 7 | 51992 |
| 34384599 | 6 | 51992 |
| 1675761 | 5 | 1675761 |
| 3465729 | 4 | 3465729 |
| 401202 | 3 | 401203 |
| 1817458 | 2 | 1817458 |
需求:查询表中所有列,保留原有排序,同时限制结果包含5个唯一的parent_id,最终仅保留parent_id为5859、21064154、51992、1675761、3465729的行,预期结果如下:
| id | score | parent_id |
|---|---|---|
| 5859 | 10 | 5859 |
| 2157043 | 9 | 5859 |
| 21064154 | 8 | 21064154 |
| 51992 | 7 | 51992 |
| 34384599 | 6 | 51992 |
| 1675761 | 5 | 1675761 |
| 3465729 | 4 | 3465729 |
解决方案
利用CTE(公共表表达式)先获取按score降序排列的前5个唯一parent_id,再关联原表筛选出这些分组的所有行,同时保留原排序:
WITH top_parents AS ( -- 按score降序取前5个唯一parent_id SELECT DISTINCT parent_id FROM your_table_name ORDER BY score DESC LIMIT 5 ) -- 筛选出这些parent_id对应的所有行,保持原排序 SELECT t.* FROM your_table_name t JOIN top_parents tp ON t.parent_id = tp.parent_id ORDER BY t.score DESC;
逻辑说明
top_parents子查询:因为原表已按score降序排列,SELECT DISTINCT parent_id ORDER BY score DESC LIMIT 5会自动获取优先级最高(对应score最大)的5个唯一parent_id,正好匹配需求中的5个值。- 关联原表:将原表与
top_parents关联,筛选出属于这5个parent_id的所有行,最后按score降序排序,完全符合预期结果。
内容的提问来源于stack exchange,提问作者icelemon
相关产品推荐
相关产品推荐

