MYSQL订单按日埋入细绳

MYSQL订单按日埋入细绳,mysql,Mysql,我有一大堆行,其中有一个名为“title”的字段,其数据如下所示: 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查

我有一大堆行,其中有一个名为“title”的字段,其数据如下所示:

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查询是否可以这样做

提前谢谢
-一个选择是为你的工作日及其排序权重创建一个等待表(临时、永久、你自己选择!)

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
列来自然排序

另一种选择:您可以通过创建用户定义的函数来实现这一点,用户定义的函数也可以这样做。然后,您可以在性能可疑的情况下,按的顺序调用UDF。该函数将查找/引用工作日的权重

  ORDER BY MyWeekdaySortingFunction(m.MyColumn)

一种选择是创建一个包含工作日及其排序权重的临时表(临时表、永久表,由您选择!)

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
列来自然排序

另一种选择:您可以通过创建用户定义的函数来实现这一点,用户定义的函数也可以这样做。然后,您可以在性能可疑的情况下,按的顺序调用UDF。该函数将查找/引用工作日的权重

  ORDER BY MyWeekdaySortingFunction(m.MyColumn)

将order by的内联case/when子句置于

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

将order by的内联case/when子句置于

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

您可以使用正则表达式提取日期,然后按日期排序,但这可能会有点过分,尤其是如果您有许多记录的话。没有单独列的原因是什么?按字符串排序不应该已经按星期天排序了吗?@Jascha正是因为你懒惰,你才应该这样做。因为现在,与
CREATE TABLE
语句中的附加列相比,对这些记录进行排序所需的工作量将非常重要。这确实是可能的-您必须找到第一个出现的空格,将其前面的所有内容对齐,对其进行比较并返回一个数值。但是它很慢(因为必须在每个记录上运行它才能创建排序顺序),而且可能有10行长:)简单的级联
REPLACE(列,“周一”,“1”)
跨越所有工作日风险太大,因为工作日可能在位置名称中。“最好加上那一栏。@佩卡,如果你好奇的话,我最后确实加上了那一栏。”。我不得不循环使用旧数据来填充字段,但总体而言,它的功能更好。感谢您的输入。您可以使用正则表达式提取日期,然后按日期排序,但这可能会有点过分,尤其是如果您有许多记录的话。没有单独列的原因是什么?按字符串排序不应该已经按星期天排序了吗?@Jascha正是因为你懒惰,你才应该这样做。因为现在,与
CREATE TABLE
语句中的附加列相比,对这些记录进行排序所需的工作量将非常重要。这确实是可能的-您必须找到第一个出现的空格,将其前面的所有内容对齐,对其进行比较并返回一个数值。但是它很慢(因为必须在每个记录上运行它才能创建排序顺序),而且可能有10行长:)简单的级联
REPLACE(列,“周一”,“1”)
跨越所有工作日风险太大,因为工作日可能在位置名称中。“最好加上那一栏。@佩卡,如果你好奇的话,我最后确实加上了那一栏。”。我不得不循环使用旧数据来填充字段,但总体而言,它的功能更好。谢谢你的意见。这比我的答案简单。如果是一次性的,那么我会选择这个解决方案。否则,如果2+段代码需要该功能,我会将其放入查找表或UDF中。+1。这比我的答案简单。如果是一次性的,那么我会选择这个解决方案。否则,如果2+段代码需要该功能,我会将其放入查找表或UDF中。