Php 按自定义顺序排序多个字段,最后为空字段

Php 按自定义顺序排序多个字段,最后为空字段,php,mysql,sorting,Php,Mysql,Sorting,我正在编辑这个问题,因为原稿的措辞非常糟糕,并且有不正确的信息,直到它被回答后我才看到,这造成了混乱,这是可以理解的。由于我无法删除它,我将尝试尽我所能编辑它 我在一个大表中有3个字段,用于存储与时间轴相关的信息,我希望对所有字段应用自定义排序 “日期”列包含年份或纪元名称。在本例中,时代名称有3个选项:早期、中期和晚期。如果“日期”列中存在年份,则在同一行中“Era”和/或“Era2”列可以选择使用纪元名称。如果“Era2”列中没有值,“Era”列中就不会有值 我想执行以下排序: 我想把所有

我正在编辑这个问题,因为原稿的措辞非常糟糕,并且有不正确的信息,直到它被回答后我才看到,这造成了混乱,这是可以理解的。由于我无法删除它,我将尝试尽我所能编辑它

我在一个大表中有3个字段,用于存储与时间轴相关的信息,我希望对所有字段应用自定义排序

“日期”列包含年份或纪元名称。在本例中,时代名称有3个选项:早期、中期和晚期。如果“日期”列中存在年份,则在同一行中“Era”和/或“Era2”列可以选择使用纪元名称。如果“Era2”列中没有值,“Era”列中就不会有值

我想执行以下排序:

  • 我想把所有三列都为空的行放在最下面

  • 然后,我希望所有的“Date”列只有一个 年份——该行中的“Era”和“Era2”列为空——位于底部。年份可以按升序排序

  • 然后,我想订购任何带有纪元名称的专栏 (“Date”、“Era”或“Era2”列)具有预定义的 定制订单(见下文)。在“日期”中定义了年份且在“纪元”或“纪元2”列中定义了值的行将在只包含纪元名称的“日期”列之前排序

预定义顺序的示例:

 ("Early Era","Mid Era","Late Era")
当前未排序的表:

Date           | Era           | Era2
-------------- |-------------- |-------------- 
         1991  | Early Era     |
         1992  | Early Era     |
    Early Era  |               |
         1999  | Mid Era       | Late Era
         1999  | Mid Era       | Early Era
      Mid Era  |               |  
     Late Era  |               |  
    Early Era  |               |  
               | Mid Era       |  
               | Late Era      |        
         2009  |               |    
     Late Era  |               |            
         2014  | Late Era      |
               |               |              
         2015  |               |         
         1992  |               |            
         1999  |               |            
         1992  | Early Era     |             
排序后的预期结果:

Date           | Era           | Era2
-------------- |-------------- |-------------- 
         1991  | Early Era     |
         1992  | Early Era     |
         1992  | Early Era     |       
    Early Era  |               |        
    Early Era  |               |
         1999  | Mid Era       | Early Era
         1999  | Mid Era       | Late Era
      Mid Era  |               |  
               | Mid Era       |  
         2014  | Late Era      |
     Late Era  |               |
     Late Era  |               |    
               | Late Era      |  
         1992  |               |  
         1999  |               |                     
         2009  |               |              
         2015  |               |         
               |               |                    
当前代码不能完全工作,但主要存在于:

SELECT *
FROM yourTable
ORDER BY
        CASE WHEN Date LIKE '%Era%' OR Era LIKE '%Era%' THEN 0 ELSE 1 END,
        CASE WHEN Date != '' THEN 0 ELSE 1 END,
        FIELD(CASE WHEN Era = '' THEN Date ELSE Era END, 'Late Era','Mid Era','Early Era') DESC, 
        CASE WHEN Era LIKE '%Era%'  THEN 0
             WHEN Date LIKE '%Era%' THEN 1 END;
排序后带有当前代码的非期望订单

Date           | Era           | Era2
-------------- |-------------- |-------------- 
         1991  | Early Era     |
         1992  | Early Era     |
         1992  | Early Era     |       
    Early Era  |               |        
    Early Era  |               |
         1999  | Mid Era       | Late Era
         1999  | Mid Era       | Early Era
      Mid Era  |               |  
         2014  | Late Era      |
     Late Era  |               |  
     Late Era  |               |  
               | Mid Era       |  
               | Late Era      |        
         2009  |               |              
         2015  |               |         
         1992  |               |            
         1999  |               |           
               |               |              
实例:

请注意,“Era2”列中的纪元名称排序不正确。此外,“纪元”列中的纪元名称(那些带有空“日期”列的纪元名称)仍然没有正确排序——它们应该与类似的纪元名称分组。第三,最底层的年份处于正确的位置,它们只是不按升序排列。希望这是有道理的,如果有什么需要进一步解释的,请告诉我,我知道这有点复杂。提前感谢您的帮助


编辑-这是一个与原始问题截然不同的问题,但希望它能澄清并纠正我最初版本中存在的问题。如果mods认为最好,他们可能会删除此问题,我很乐意创建一个新问题。

您可以尝试以下查询:

SELECT *
FROM yourTable
ORDER BY
    CASE WHEN Date LIKE '%Era%' OR Era LIKE '%Era%' THEN 0 ELSE 1 END,
    CASE WHEN Date IS NOT NULL THEN 0 ELSE 1 END,
    FIELD(COALESCE(Era, Date), 'Late Era','Mid Era','Early Era') DESC, 
    CASE WHEN Era LIKE '%Era%'  THEN 0
         WHEN Date LIKE '%Era%' THEN 1 END;
此查询基于我在您的预期输出中看到的内容。也就是说,它按优先顺序选择以下内容:

  • 日期
    纪元
    中有文本
    纪元
    的记录出现在没有此文本的记录之前
  • 日期为
    NULL
    的记录位于日期不为
    NULL
  • 然后按早、中、晚、
    NULL
    顺序订购(您几乎已经有了这个)
  • 最后,在
    era
    列中,将带有
    Date
    era的记录放在带有era的记录之后
此处演示:


您可以尝试以下查询:

SELECT *
FROM yourTable
ORDER BY
    CASE WHEN Date LIKE '%Era%' OR Era LIKE '%Era%' THEN 0 ELSE 1 END,
    CASE WHEN Date IS NOT NULL THEN 0 ELSE 1 END,
    FIELD(COALESCE(Era, Date), 'Late Era','Mid Era','Early Era') DESC, 
    CASE WHEN Era LIKE '%Era%'  THEN 0
         WHEN Date LIKE '%Era%' THEN 1 END;
此查询基于我在您的预期输出中看到的内容。也就是说,它按优先顺序选择以下内容:

  • 日期
    纪元
    中有文本
    纪元
    的记录出现在没有此文本的记录之前
  • 日期为
    NULL
    的记录位于日期不为
    NULL
  • 然后按早、中、晚、
    NULL
    顺序订购(您几乎已经有了这个)
  • 最后,在
    era
    列中,将带有
    Date
    era的记录放在带有era的记录之后
此处演示:


回答这个问题的人最初给了我一个部分有效的答案,在上面的评论中,他鼓励我在得到完整答案后编辑他的答案。一旦我得到了完整的工作解决方案,我就编辑了他的答案,但是这些编辑没有得到批准。因此,我想为任何觉得有用的人发布完整的工作解决方案:

SELECT *
FROM yourTable
ORDER BY
      CASE WHEN concat(Era,Era,Date) LIKE '%Era%' THEN 0 else 1 end,
      FIELD(CASE WHEN Era = '' THEN Date ELSE Era END, 'Late Era','Mid Era','Early Era') desc,
      CASE WHEN Date!='' THEN 0 ELSE 1 end,
      CASE WHEN date not like '%Era%' THEN 0 else 1 end,
      date, Era2

回答这个问题的人最初给了我一个部分有效的答案,在上面的评论中,他鼓励我在得到完整答案后编辑他的答案。一旦我得到了完整的工作解决方案,我就编辑了他的答案,但是这些编辑没有得到批准。因此,我想为任何觉得有用的人发布完整的工作解决方案:

SELECT *
FROM yourTable
ORDER BY
      CASE WHEN concat(Era,Era,Date) LIKE '%Era%' THEN 0 else 1 end,
      FIELD(CASE WHEN Era = '' THEN Date ELSE Era END, 'Late Era','Mid Era','Early Era') desc,
      CASE WHEN Date!='' THEN 0 ELSE 1 end,
      CASE WHEN date not like '%Era%' THEN 0 else 1 end,
      date, Era2

这些日期究竟是什么?它们必须是字符串,你不应该这样做。正如您所看到的,它使排序(以及几乎所有其他事情)成为一场真正的噩梦。相反,将所有日期信息存储在真正的日期列中。让生活快乐,而不是悲伤。当日期未知时,我需要灵活地给时代起个名字。如果您已经阅读了该线程,那么我真正的问题是按照预定义的顺序对多个列进行排序。只包含日期的列始终位于底部,因此这并不是真正的问题。这似乎是一个问题,因为输出日期已排序。你是说日期可以以任何顺序出现吗?不,我是说我已经正确地将日期与它们的年代分开排序了。我的困难是把它们按年代分类。你没读那条线吗?我觉得我已经谈过了。最后一个表是我当前的代码输出——请注意,日期是按顺序排列的,与它们的年代不同。批评它的设置方式对我没有好处。这是我必须使用的当前设置。这些日期究竟是什么?它们必须是字符串,你不应该这样做。因为你是一个骗子