2012-08-07 53 views
0

我的表包括記錄,其中每條記錄都有自己的歷史,看起來像這樣:排序MySQL表

65465406540-245|65465408540-654 

沒有限制歷史條目數(字段類型是文本,所以.. )。歷史記錄始終按照最舊到最新排序。這意味着最新的條目在右邊。

歷史條目由管道字符「|」分隔。一個歷史記錄條目由時間戳,破折號「 - 」作爲分隔符和代表進行更改的用戶ID的1-4位數字組成。

現在我的問題是我想根據最近(或最早)的歷史記錄對錶格中的記錄進行排序。我會怎麼做?

我在想MySQL的功能,因爲結果必須來到我的PHP腳本已經排序,但我不知道從哪裏開始,所以每個幫助都非常感謝。

回答

1

對於最古老的可以使用RedFilters(現節錄)通過最新

ORDER BY LEFT(column_name,11) 

訂購的答案是多一點樂趣。

ORDER BY REVERSE(SUBSTR(REVERSE(column_name),1,LOCATE("|",REVERSE(column_name))-1)) 

讓我們來分析一下。 我們顛倒了列並找到了第一個|

456-04580456456|542-04560456456 

然後我們拿到的串到這點,這給了我們:

456-04580456456 

這讓現在顛倒過來了最後一個項目,我們可以簡單地REVERSE通過串並以由最後訂購item:

65465408540-654 

但是,這很可怕。如果可能的話,我會考慮用PHP來做這件事。

+0

我可能會描述它是錯誤的。我需要的是按照最後一個時間戳(asc/desc)排序。爲了解決這個問題,我非常感謝@Jim複雜的查詢,我只是添加了ASC或DESC。謝謝! – meridius 2012-08-07 20:39:52

0

我調整了Jim的查詢,因此它也可以只與一個和/或無歷史記錄項一起使用,並且僅顯示時間戳以便於日期/時間計算。 它在這裏:

SELECT *, 
    IF(
     LOCATE('|', history) > 0, 
     LEFT(
      REVERSE(
       LEFT(
        REVERSE(history), 
        LOCATE('|', REVERSE(history))-1 
       ) 
      ), 
      10 
     ), 
     LEFT(history, 10) 
    ) AS last 
FROM table 
ORDER BY last DESC