我的桌子看起来像这样...
mysql> select * from billing_order_history;
+----------+---------------+--------------+---------------------+
| order_id | modify_action | new_order_id | modified_by_user_id |
+----------+---------------+--------------+---------------------+
| 52 | 2 | 54 | 1 |
| 54 | 2 | 55 | 1 |
| 55 | 2 | 56 | 1 |
+----------+---------------+--------------+---------------------+
3 rows in set (0.00 sec)
旧订单ID已连接到新订单ID。 52>> 54>> 55>> 56
我需要返回最新的订单ID,即56,原始订单ID为52。
如果我在where子句中添加b.order_id = 52,我编写了以下自连接。
select max(a.new_order_id) from billing_order_history as a inner join billing_order_history as b on a.order_id = b.new_order_id
架构和样本记录:
CREATE TABLE billing_order_history (
order_id bigint(20) ,
modify_action int(11) ,
new_order_id bigint(20) ,
modified_by_user_id bigint(20)
) ;
insert into billing_order_history values (52, 2, 54, 1), (54, 2, 55, 1), (55,2,56,1);
答案 0 :(得分:3)
你可以试试这个:
select max(latest)
from (
Select @latest:=case when @latest=order_id then new_order_id else @latest end
as latest from billing_order_history, (select @latest:=55 ) as t
order by order_id) as t1;
答案 1 :(得分:1)
我的最后一个信息是MySQL还不支持递归查询。 2011年12月,this post提到了PostgreSQL或Sybase。
剩下的选择是从编程语言迭代SQL查询,直到得到空结果。
答案 2 :(得分:1)
最好增强您的架构以建立从任何订单到最新订单的链接。这通常使用所谓的传递闭包表来完成。
您应该选择从任何订单到最新订单的连续维护(每次插入新订单时),或仅在您需要使用它时。这主要是一个以绩效为导向的决策。在大多数情况下,传递闭包表将继续保持。
在添加一个订单(或一组不在其中形成任何链的新订单)之后,只需要一个UPDATE
语句就可以使用其先前的值和新订单更新传递闭包表。
从MySQL Version 5开始,您可以使用billing_order_history
上的触发器来更新传递闭包表(可以作为单独的表实现,也可以作为billing_order_history
中的另一个列实现)。