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