Mysql 如何获取下表数据的映射历史记录

Mysql 如何获取下表数据的映射历史记录,mysql,sql,Mysql,Sql,我有一个UserId更改的历史映射表,每次UserId更改时,都会在历史表中插入一行新UserId和旧UserId。 以下是示例表和数据: UserIdNew | UserIdOld --------------------- 5 | 1 10 | 5 15 | 10 上面的数据解释了userid1已经从userid1->5->10->15进行了以下转换 我想为一个给定的UserIdNew查询所有旧的id

我有一个UserId更改的历史映射表,每次UserId更改时,都会在历史表中插入一行新UserId和旧UserId。 以下是示例表和数据:

UserIdNew | UserIdOld
---------------------
    5     |     1    
    10    |     5    
    15    |     10   
上面的数据解释了userid1已经从userid1->5->10->15进行了以下转换

我想为一个给定的UserIdNew查询所有旧的id,如何在一个查询中完成


对于这种情况,如果UserIdNew=15,那么它应该返回1,5,10

,如果UserIdNew总是大于UserIds链中以前的旧值,即如果像10->20->5->1这样的情况从未发生过,则此查询可以执行未经完全测试的任务,使用新值和旧值代替字段名:

SELECT 
  CASE
    WHEN new=7 THEN @seq:=concat(new,',',old)
    WHEN substring_index(@seq,',',-1)=new THEN concat(@seq,',',old)
    ELSE @seq
  END AS SEQUENCE 
FROM (SELECT * FROM UserIdsTable ORDER BY new DESC) AS SortedIds 
ORDER BY SEQUENCE DESC 
LIMIT 1

如果UserIdNew始终大于UserIds链中的前一个旧的,即如果像10->20->5->1这样的情况从未发生,则此查询可以执行未完全测试的作业,使用新的和旧的字段名代替您的字段名:

SELECT 
  CASE
    WHEN new=7 THEN @seq:=concat(new,',',old)
    WHEN substring_index(@seq,',',-1)=new THEN concat(@seq,',',old)
    ELSE @seq
  END AS SEQUENCE 
FROM (SELECT * FROM UserIdsTable ORDER BY new DESC) AS SortedIds 
ORDER BY SEQUENCE DESC 
LIMIT 1

您需要一个递归解决方案。这些类型的解决方案高度依赖于数据库,因此请标记您正在使用的DBMS。还有,ID可以重复吗?@EzLo,没有ID不会重复。你需要一个递归解决方案。这些类型的解决方案高度依赖于数据库,因此请标记您正在使用的DBMS。还有,ID可以重复吗?@EzLo,没有ID不会重复。