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

标签 mysql sql

我在 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)。

最佳答案

您正在寻找LEADLAG具有Windows功能,但支持mysql版本高于8.0。因此您可以在 select

上编写子查询

看起来像这样。

TestDLL

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

关于mysql - 如何按组从mysql获取下一行/上一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416745/

相关文章:

php - PHP Mysql中int、bigint和timestamp中使用数据类型字段存储时间戳

mysql - 需要确保 mysqldump 不会在计划的备份计划中创建空转储文件

sql - 获取所有不同值的连续行?

sql - 使用函数的 SQL Server 查询速度非常慢

sql - 带有 JOIN 和 WHERE 子句的 INSERT 语句

php - 仅返回文本的前 500 个字符

mysql - 使用带有自定义列的选择插入多行

javascript - 调试时 SQL 数据库中的图像未显示在 GridView 中,但测试查询时却显示?

sql - 如何在 T-SQL 中标准化混合日期格式的列

c#数据库选择然后插入。但是值为0