2013-04-15 2 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 >> 나는 다음과 같은 자체가 내가 추가하는 경우 작동하지 않습니다에 가입 작성한 원래 주문 ID (52)

주어진 예 (56) 최신 주문 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의 다른 열로 구현할 수 있습니다.