2013-04-15 52 views
2

我有表,看起來像這樣...最大值加入

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

我需要給原來的順序編號52

我寫了下面的自連接,如果我添加不工作,即返回最新訂單ID 56 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

你可以試試這個:

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

我最後的信息是,MySQL的還不支持遞歸查詢。 2011年12月,this post稱爲PostgreSQL或Sybase。

您剩下的選擇是從您的編程語言迭代SQL查詢,直到獲得空結果。

1

增強您的架構以建立從任何訂單到最新訂單的鏈接是一件好事。這通常使用所謂的傳遞閉合表完成。

您應該選擇是否連續保持從任何訂單到最新訂單的鏈接(每次插入新訂單時),或者僅在需要使用該訂單時進行選擇。這主要是一個以績效爲導向的決定。在大多數情況下,傳遞閉合表將被持續保持。

在添加一個訂單(或一組新訂單不相互之間形成任何鏈)之後,只需要一條UPDATE語句就可以使用其先前的值和新訂單來更新傳遞封閉表。

從MySQL版本5開始,您可以使用billing_order_history上的觸發器來更新傳遞閉包表(可以作爲單獨的表或billing_order_history中的另一列來實現)。