Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mySQL中按订单定义自定义订单_Mysql - Fatal编程技术网

如何在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 结果应

在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

结果应该是: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

然而,请注意

  • 这会降低SQL的可移植性,因为其他DBMS可能没有这样的功能

  • 当您的语言列表(或其他排序依据的值)变得更长时,最好为它们提供一个单独的带有sortorder列的表,并将其连接到查询中进行排序


  • 对于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();