2012-05-22 4 views
2

MySQL (5.5)에서 다소 느슨한 데이터를 다루고 있습니다. 나는 두 상태 (새로운, 활성, 비활성 등)와 "위치"변화를 추적하는 데 사용되는 테이블을 가지고 있는데, 위치는 x.0.y 형식이며, x와 y는 양의 정수입니다.MySQL에서 왼쪽 join 행의 우선 순위 지정

위치 변경을 별도의 테이블로 옮기려고하지만 그렇게하기 위해 테이블의 다른 레코드에서 전체 이전 위치를 복구해야합니다.

id  status  new_loc  timestamp 
--  ------  -------  --------- 
5  1 -> 1  1.0.2  2012-05-21 00:00:00 
5  new   1.0.1  2012-05-21 00:00:03 
5  1 -> 2  2.0.1  2012-05-22 00:00:00 
5  2 -> 3  3.0.1  2012-05-23 00:00:00 

그래서, 위치 변화가 일어날 때, 기록 된 모든 전체 새 위치와 이전의 첫 번째 작품이다 : 당신이 아래에 볼 수있는 전체 이전 위치는 위치 변경 기록에 저장되지 않습니다 위치 (상태 메시지의 왼쪽). 그러나 이전 기록을보고 전체 이전 위치를 찾을 수 있습니다.

내 주요 문제는 두 번째 행입니다. "새"상태는 ID가 5 인 객체가 방금 데이터베이스에 추가되었음을 의미합니다. 이 값은 항상 테이블의 모든 ID에 대한 첫 번째 상태 여야합니다. 그러나 초기 변경 기록 후 약 3 초 후에 "새"레코드가 삽입되는 경우가 많습니다. 이 경우 위치 1.0.1이 추가 된 다음 1.0.2로 변경된 후 2.0.1로 변경된 다음 3.0.1로 변경됩니다. (편집 : 실제 예제는 간단하거나 간단하지는 않지만 인간이 쉽게 쉽게 구별 할 수있는 위치의 "경로"가 항상 있습니다.)

두 행 1을 모두 고려하는 쿼리를 작성하는 데 문제가 있습니다. 행 3. 순서가 잘못되었을 수 있기 때문에 가장 최근의 레코드를 찾을 수 없습니다. 여러 개의 일치가있을 수 있기 때문에 내 상태와 일치하는 new_loc을 사용하여 레코드를 가져올 수 없습니다. 존재하는 경우

  1. 는, 가장 최근의 이전 위치 변화를 찾아, 그 new_loc를 사용 : 여기

    내가 작동 것이라고 생각 것입니다.

  2. 이전 변경 사항이없는 경우 해당 ID에 대한 "새"상태의 레코드를 찾고 new_loc을 사용하십시오.

나는 현재 LEFT은 그 두 가지 조건에 일치 가입 가지고,하지만 난 "행 조건 1. 합류 좋아" "아무 조건 1과 일치하지 않는 경우에만 조건 2에 가입"또는 말을하는 방법을 모른다

나는 이것을 수행하는 방법을 알 수 없다. 어떤 도움을 주셔서 감사합니다.

편집 : id가이 테이블의 인덱스가 아니라 오브젝트 ID임을 분명히해야합니다. 기본 키는 (id, status)입니다.

+0

위치가 단조롭게 증가합니까? 그렇다면 위치 (또는 그 단편)별로 주문하여 현재 위치 이전 위치를 결정할 수 있습니다. – encoded

+0

아니요, 안타깝게도 운이나 이유는 없습니다. 위치 문자열은 임의적이며 변경 사항은 임의적입니다. 구조를 유지하면서도 따라하기 쉽기 때문에 예제를 선택했습니다. – wizzard

답변

0

나는 당신이하려는 것을 이해하고 있음을 확인하도록하겠습니다. 의사 코드에서 이것은 당신이 찾고있는 것을 할 것입니까?

given 
    table A (as in your answer) 
    table B (objectid, old, new) 
for any `id` 
    get all rows 
    order rows by `status` column such that 'new' is the first value, and then numerically 
    take the location in the first `status` column c and insert it into table B with values id, 'new', (c).location 
    for all remaining `status` fields selected: 
     for any field n, insert into table B with values id, (n-1).location, (n).location 

스토어드 프로 시저에서는 가능해야하지만 작성하는 데는 힘들 것입니다.