【问题标题】:MYSQL: Get Previous Row but on base of Non primary ColumnMYSQL:获取上一行但基于非主列
【发布时间】:2023-03-12 05:07:01
【问题描述】:

我在 MYSQL 表中有以下数据:活动

ID 是主列

TID 不是主要的

ID          Name    TID

11145       Reg     111
14008       Inn     111
20246       Opp     111 <>
20250       Godk    111 <--
111450      Reg     222
140080      Inn     222
202460      Opp     222 <>
202500      Godk    222 <--

我只需要获取 Name = "Godk" 所在行的前一行。您可以看到上一列并不总是primaryID-1,但可以是primaryid-n

期望的结果

20246       Opp     111
202460      Opp     222

我尝试使用以下方法,但有条理

SELECT x.* , MAX(y.ID) as prev, 
FROM Activity x,  
INNER JOIN Activity y 
ON y.TID = x.TID
AND y.ID < x.ID 
where y.Name like '%Godk%'
GROUP 
 BY x.TID
 , x.ID; 

但我根本没有得到预期的结果。

【问题讨论】:

  • 你用的是哪个版本的mysql?
  • @RadimBača:5.7.9

标签: mysql sql join union


【解决方案1】:

我们可以使用相关子查询来处理这个问题:

SELECT
    ID,
    Name,
    TID
FROM Activity a1
WHERE
    (SELECT a2.Name FROM Activity a2
     WHERE a1.TID = a2.TID AND
           a2.ID > a1.ID
     ORDER BY a2.ID
     LIMIT 1) = 'Godk';

Demo

但如果您使用的是 MySQL 8+,那么LEAD 解析函数是一种更简洁的方法:

WITH cte AS (
    SELECT ID, Name, TID,
        LEAD(Name, 1) OVER (PARTITION BY TID ORDER BY ID) AS lead_name
    FROM Activity
)

SELECT ID, Name, TID
FROM cte
WHERE lead_name = 'Godk';

Demo

【讨论】:

  • 谢谢,让我在我的场景中执行并回复你
【解决方案2】:

我相信您的解决方案中只有小错误

SELECT MAX(y.ID) as prev, y.TID
FROM Activity x
INNER JOIN Activity y ON y.TID = x.TID AND y.ID < x.ID 
WHERE x.Name like '%Godk%'
GROUP BY y.TID

但是,此解决方案不包含 Name 属性。如果您在结果中需要它,请为此使用另一个联接。

SELECT a.ID, a.name, a.TID
FROM Activity a
JOIN (
    SELECT MAX(y.ID) as id, y.TID
    FROM Activity x
    INNER JOIN Activity y ON y.TID = x.TID AND y.ID < x.ID 
    WHERE x.Name like '%Godk%'
    GROUP BY y.TID
) t ON a.TID = t.TID and 
       a.ID = t.ID

【讨论】:

  • 谢谢,让我在我的场景中执行并回复你
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 2019-07-07
  • 2017-10-28
  • 2017-03-03
  • 1970-01-01
  • 2023-04-10
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多