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