2012-05-22 26 views
2

我正在處理MySQL(5.5)中的一些稍微棘手的數據。我有一個表用於跟蹤狀態(新的,活動的,非活動狀態等)和「位置」更改,其中位置格式爲x.0.y,x和y爲正整數。確定MySQL中的左連接行的優先級

我想將位置更改移動到單獨的表中,但爲了這樣做,我需要從表中的其他記錄中恢復完整的舊位置。完整的老位置沒有存儲在位置變化的記錄,你可以看到如下:

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的第一個狀態。但是,有很多情況下,在新變更記錄後約三秒插入「新」記錄。在這種情況下,它添加了位置1.0.1,然後更改爲1.0.2,然後更改爲2.0.1,然後更改爲3.0.1。 (編輯:真實的例子不是這麼簡單或直接,但總是有一條人類可以很容易辨別的位置的「路徑」。)

我遇到了問題,試圖編寫一個查詢來解決第1行和第3行。我不能找到最近的記錄,因爲它們可能不合適。我不能用符合我的狀態的new_loc來抓取記錄,因爲可能有多個匹配。

這是我認爲將工作:

  1. 查找最近的先前位置的變化,如果存在的話,並使用其new_loc。
  2. 如果以前沒有更改,請爲該ID找到具有「新」狀態的記錄並使用其new_loc。

我目前有一個左連接匹配這兩個條件,但我不知道該怎麼說「如果沒有匹配條件1,只加入條件2」或「優先加入條件1的行」。

我只是不知道如何做到這一點。任何幫助表示讚賞。

編輯:我應該清楚,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 

這應該是可能的存儲過程...但它可能是代碼痛苦位來寫。