sql—如何按组从mysql获取下一行/上一行

hts6caw3  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(570)

我在mysql上有这样一个表:

ID    Name    Group
1     One      A
2     Two      B
3     Three    A
4     Fore     C
5     Five     B
6     Six      A
7     Seven    B

我想从所选行中获取同一组中的上一行/下一行。例如,如果我选择了id=5的行,那么当我没有关于该行的任何信息和关于下一行(id=7)的信息时,如何获得相同组的前一行(id=2)。

eh57zj3b

eh57zj3b1#

你是在寻找领先还是落后 Windows function ,但mysql支持的版本高于8.0。因此,您可以在 select 像这样。
测试DLL

CREATE TABLE T(
   ID int,
   Name VARCHAR(100),
   `Group` VARCHAR(5)
);

INSERT INTO T VALUES (1,'One','A');
INSERT INTO T VALUES (2,'Two','B');
INSERT INTO T VALUES (3,'Three','A');
INSERT INTO T VALUES (4,'Fore','C');
INSERT INTO T VALUES (5,'Five','B');
INSERT INTO T VALUES (6,'Six','A');
INSERT INTO T VALUES (7,'Seven','B');

查询

select *,IFNULL((
          SELECT t2.ID
          FROM T t2 
          WHERE t1.Group = t2.Group and t1.ID > t2.ID 
          ORDER BY t2.ID DESC
          LIMIT 1
         ),t1.ID)previousID
         ,IFNULL((
          SELECT t2.ID
          FROM T t2 
          WHERE t1.Group = t2.Group and t1.ID < t2.ID 
          ORDER BY t2.ID 
          LIMIT 1
         ),t1.ID) nextID
from T t1

[结果]:

| ID |  Name | Group | previousID | nextID |
|----|-------|-------|------------|--------|
|  1 |   One |     A |          1 |      3 |
|  2 |   Two |     B |          2 |      5 |
|  3 | Three |     A |          1 |      6 |
|  4 |  Fore |     C |          4 |      4 |
|  5 |  Five |     B |          2 |      7 |
|  6 |   Six |     A |          3 |      6 |
|  7 | Seven |     B |          5 |      7 |

如果你的mysql支持windows函数,你可以试试这个。

select *,
  LAG(ID)previousID,
  LEAD(ID) nextID
from T

sqlfiddle公司

相关问题