如何在mySQL中按订单定义自定义订单
在MySQL中,如何定义自定义排序顺序 为了解释我想要的东西,请考虑一下这个表:如何在mySQL中按订单定义自定义订单,mysql,Mysql,在MySQL中,如何定义自定义排序顺序 为了解释我想要的东西,请考虑一下这个表: ID Language Text 0 ENU a 0 JPN b 0 DAN c 1 ENU d 1 JPN e 1 DAN f 2 etc... 在这里,我想返回按语言和升序ID排序的所有行,以便首先返回Language=ENU,然后返回JPN,最后返回DAN 结果应
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
在这里,我想返回按语言和升序ID排序的所有行,以便首先返回Language=ENU,然后返回JPN,最后返回DAN
结果应该是:a、d、b、e、c、f等
这可能吗?如果只有这三个值,那么您可以使用: (如果可能存在其他值,则您可能需要添加一些额外的逻辑以保持排序一致;例如,您可以将
ELSE 4
添加到该CASE
表达式中,然后按语言
本身排序,作为第三个排序标准:
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
ELSE 4
END,
`Language`
)您现在有两个选择,第一个是将语言更改为ENUM(假设这是可能的,并且您只希望有一些变化) 如果将其指定为
ENUM('ENU'、'JPN'、'DAN')
,则ORDER Language ASC
将按照您指定的顺序进行排序
第二个将涉及某个地方的案例,即
SELECT * FROM table
ORDER BY CASE Language
WHEN 'ENU' THEN 3
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 1
ELSE 0
END DESC, ID ASC
在性能方面,枚举方法将返回更快的结果,但如果需要添加更多语言,则会更麻烦。第三种选择是为这些语言添加一个规范化表,但在这种情况下,这可能会有些过分。MySQL有一个名为的方便函数,非常适合这样的任务
按字段排序(语言、'ENU'、'JPN'、'DAN')、ID
然而,请注意
对于Yii2框架,我们通过以下方式实现
Project::find()
->orderBy([
new Expression('FIELD(pid_is_t_m,2,0,1)'),
'task_last_work'=> SORT_ASC
])->all();
如果有很多语言值,你可以有一个单独的表来存储每种语言,再加上一个排序顺序列并链接到该列,这将首先按ID排序,结果是a,b,c,d,e,F谢谢这很好用-就像我接受的Mchl的答案一样,因为它看起来很简单谢谢这很适合我的情况,我只需要按两个值排序(一个主语言,例如JPN,一个后备语言,例如ENU)。伙计,你刚刚在magento中为我保存了一个重写:)如果你以前有一个
分组依据
?例如,我想要的第一个值出现在末尾?将带有GROUP BY
的查询放在子查询中,并在外部queryNice中对其排序。我正在编写一个case order by子句,但是field()更紧凑,更容易重新排序。您在表定义中键入ENUM('ENU','JPN','DAN')
?@pathros的具体位置,您可以将其指定为ENUM,而不是VARCHAR等。MySQL在内部以特定顺序存储ENUM选项并对它们进行索引,因此,当按枚举列进行排序时,它将使用该内部索引而不是字符串值(除非使用CAST()将其返回到VARCHAR),而不应END DESC,
为END CASE DESC,
?否。并非所有的案例
都需要结束案例
,这取决于上下文<程序中的代码>案例需要结束案例
(),但是SELECT中的案例
不需要结束案例
,只需结束
()-在这种情况下,它是一个控制流功能。
Project::find()
->orderBy([
new Expression('FIELD(pid_is_t_m,2,0,1)'),
'task_last_work'=> SORT_ASC
])->all();