Php 按自定义顺序排序多个字段,最后为空字段
我正在编辑这个问题,因为原稿的措辞非常糟糕,并且有不正确的信息,直到它被回答后我才看到,这造成了混乱,这是可以理解的。由于我无法删除它,我将尝试尽我所能编辑它 我在一个大表中有3个字段,用于存储与时间轴相关的信息,我希望对所有字段应用自定义排序 “日期”列包含年份或纪元名称。在本例中,时代名称有3个选项:早期、中期和晚期。如果“日期”列中存在年份,则在同一行中“Era”和/或“Era2”列可以选择使用纪元名称。如果“Era2”列中没有值,“Era”列中就不会有值 我想执行以下排序:Php 按自定义顺序排序多个字段,最后为空字段,php,mysql,sorting,Php,Mysql,Sorting,我正在编辑这个问题,因为原稿的措辞非常糟糕,并且有不正确的信息,直到它被回答后我才看到,这造成了混乱,这是可以理解的。由于我无法删除它,我将尝试尽我所能编辑它 我在一个大表中有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
era的记录放在带有era的记录之后Date
您可以尝试以下查询:
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
era的记录放在带有era的记录之后Date
回答这个问题的人最初给了我一个部分有效的答案,在上面的评论中,他鼓励我在得到完整答案后编辑他的答案。一旦我得到了完整的工作解决方案,我就编辑了他的答案,但是这些编辑没有得到批准。因此,我想为任何觉得有用的人发布完整的工作解决方案:
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
这些日期究竟是什么?它们必须是字符串,你不应该这样做。正如您所看到的,它使排序(以及几乎所有其他事情)成为一场真正的噩梦。相反,将所有日期信息存储在真正的日期列中。让生活快乐,而不是悲伤。当日期未知时,我需要灵活地给时代起个名字。如果您已经阅读了该线程,那么我真正的问题是按照预定义的顺序对多个列进行排序。只包含日期的列始终位于底部,因此这并不是真正的问题。这似乎是一个问题,因为输出日期已排序。你是说日期可以以任何顺序出现吗?不,我是说我已经正确地将日期与它们的年代分开排序了。我的困难是把它们按年代分类。你没读那条线吗?我觉得我已经谈过了。最后一个表是我当前的代码输出——请注意,日期是按顺序排列的,与它们的年代不同。批评它的设置方式对我没有好处。这是我必须使用的当前设置。这些日期究竟是什么?它们必须是字符串,你不应该这样做。因为你是一个骗子