我正在處理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來抓取記錄,因爲可能有多個匹配。
這是我認爲將工作:
- 查找最近的先前位置的變化,如果存在的話,並使用其new_loc。
- 如果以前沒有更改,請爲該ID找到具有「新」狀態的記錄並使用其new_loc。
我目前有一個左連接匹配這兩個條件,但我不知道該怎麼說「如果沒有匹配條件1,只加入條件2」或「優先加入條件1的行」。
我只是不知道如何做到這一點。任何幫助表示讚賞。
編輯:我應該清楚,ID是一個對象ID,顯然不只是在這張桌子上的索引。主鍵是(id,status)。
位置單調遞增嗎?如果是這樣,您可能能夠按位置(或其片段)來確定哪個位置在當前位置之前。 – encoded
不,不幸的是,沒有韻或類似的原因,位置字符串是任意的,變化是隨機的。我只是選擇了這些例子,因爲它們更容易遵循,同時仍然保持結構。 – wizzard