-1

首先,我的表架构如下所示:

CREATE TABLE `list` (`id` INT NOT NULL AUTO_INCREMENT , `parentId` INT NOT NULL , PRIMARY KEY (`id`));

INSERT INTO `list` (`id`, `parentId`) VALUES ('1', '1');
INSERT INTO `list` (`id`, `parentId`) VALUES ('2', '1');
INSERT INTO `list` (`id`, `parentId`) VALUES ('3', '1');

INSERT INTO `list` (`id`, `parentId`) VALUES ('4', '2');
INSERT INTO `list` (`id`, `parentId`) VALUES ('5', '2');
INSERT INTO `list` (`id`, `parentId`) VALUES ('6', '2');

INSERT INTO `list` (`id`, `parentId`) VALUES ('7', '3');
INSERT INTO `list` (`id`, `parentId`) VALUES ('8', '3');
INSERT INTO `list` (`id`, `parentId`) VALUES ('9', '3');

我有一个返回此数据的查询,例如:

| id | parentId |
|----|----------|
|  1 |        1 |
|  2 |        1 |
|  3 |        1 |
|  4 |        2 |
|  5 |        2 |
|  6 |        2 |
|  7 |        3 |
|  8 |        3 |
|  9 |        3 |

以上所有数据都是从选择查询生成的:

SELECT `id`, `parentId` FROM `table` ORDER BY `id`;

我需要结果是每个 parentId 最多 2 条记录。结果需要如下所示:

    | id | parentId |
    |----|----------|
    |  1 |        1 |
    |  2 |        1 |
    |  4 |        2 |
    |  5 |        2 |
    |  7 |        3 |
    |  8 |        3 |

我如何实现这一目标?我一直在网上搜索,但似乎没有运气。任何帮助都感激不尽。

谢谢你。

4

1 回答 1

1

对于 MySql 8.0+,您可以使用ROW_NUMBER()

SELECT t.id, t.parentid
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY parentid ORDER BY id) rn
  FROM list
) t
WHERE t.rn <= 2

请参阅演示
结果:

| id  | parentid |
| --- | -------- |
| 1   | 1        |
| 2   | 1        |
| 4   | 2        |
| 5   | 2        |
| 7   | 3        |
| 8   | 3        |


对于以前不能使用窗口函数的版本,试试这个(对于大表效率不高)解决方案:

SELECT t.* 
FROM list t
WHERE 2 > (
  SELECT COUNT(*) 
  FROM list 
  WHERE parentid = t.parentid AND id < t.id
)

请参阅演示

于 2020-01-01T17:18:39.420 回答