2011-04-02 25 views
0

我有一大堆的行了一個名爲「稱號」現場誰的數據是這樣的:mysql命令字符串中埋

Friday 8:00AM - Hunter Arena 2 
Wednesday 7:30AM - West Grass Field 
Thursday 8:00AM - Hunter Arena 1 
Saturday 8:00AM - Hunter Arena 1 
Wednesday 8:00AM - Hunter Arena 2 

我期待通過一天的一週訂購。 (我假設將涉及解析字符串,然後做某種日期排序)這可能與MYSQL查詢?

在此先感謝 -J

+1

你可以使用正則表達式來提取日期,然後排序,但認爲可能是矯枉過正,特別是如果你有很多記錄。沒有單獨列的理由? – 2011-04-02 16:18:14

+0

不應該由字符串排序已按星期排序嗎? – 2011-04-02 16:18:45

+0

@darin,我很懶。我得到的記錄來自同一個表格行中所有信息的網站,當我最初編寫程序時我並不認爲要將該日提取到另一列中,我希望能避免重新加入並添加該欄。 @Pekka,它將日子分組,但不是按照星期的順序。 – 2011-04-02 16:20:22

回答

2

一種選擇是創建一個保持表(臨時,永久的,您的選擇!)某種你平日和他們的排序權重的。

CREATE TEMPORARY TABLE WkDayWeight (weekday varchar(100), orderWeight int); 
INSERT INTO WkDayWeight (weekday, orderWeight) 
    SELECT   'Monday',1 
    UNION ALL SELECT 'Tuesday',2 
    UNION ALL SELECT 'Wednesday',3 
    UNION ALL SELECT 'Thursday',4 
    UNION ALL SELECT 'Friday',5 
    UNION ALL SELECT 'Saturday',6 
    UNION ALL SELECT 'Sunday',7 

然後,你可以提取您的列的第一個字(即找到星期幾),並加入平日的排序權重的支撐/參考表。

SELECT * 
FROM MyTable AS m 
INNER JOIN WkDayWeight AS d 
    ON d.weekday = SUBSTRING_INDEX(m.MyColumn,' ',1) 
ORDER BY d.orderWeight 

它更最好實際上有一個datetime列,以便能夠自然排序。

另一種替代:你可以通過創建一個用戶定義的函數來達到另一種方式。然後,您可能會以可疑的表現在您的ORDER BY中調用UDF。該功能會查找/引用週日的重量。

ORDER BY MyWeekdaySortingFunction(m.MyColumn) 
+0

這真的很酷。絕對可以避免,但很高興看到。 – 2011-04-02 16:52:17

2

把一個內聯箱/時子句的順序由...

select 
     yt.YourDataColumns 
    from 
     YourTable yt 
    order by 
     case when "Sunday" = left(yt.Title, 6) then 1 
      when "Monday" = left(yt,Title, 6) then 2 
      when "Tuesday" = left(yt,Title, 7) then 3 
      when "Wednesday" = left(yt,Title, 9) then 4 
      when "Thursday" = left(yt,Title, 8) then 5 
      when "Friday" = left(yt,Title, 6) then 6 
      else 7 
     end 
+0

+1。這比我的答案簡單。如果它是一次性的,那麼我會選擇這個解決方案。否則,如果2+代碼片段需要該功能,我會把它放到查找表或UDF中。 – 2011-04-02 16:59:42