使用自联接的最大值

时间:2013-04-15 07:33:46

标签: mysql stored-procedures stored-functions

我的桌子看起来像这样...

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);

3 个答案:

答案 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中的另一个列实现)。