Yii2:如何使用mysql在Find()的orderby()中添加两个字段和NULLS LAST

时间:2018-12-11 06:05:59

标签: php mysql yii2

尝试做类似于this question的事情,但需要为MySQL排序NULLS LAST

类似...

$query->MODEL_NAME::find(); 
$query->orderBy(['column_1' => 'IS NULL','column_1'=> SORT_DESC]);

尽管此语法是错误的。谢谢!

当我尝试orderBy('column_1 IS NULL ASC, column_1 desc')时收到错误消息

  

SQLSTATE [42S22]:找不到列:1054未知列。 SQL正在   执行为:SELECT * FROM 'table' ORDER BY 'due_date IS NULL'

注意:在上面的错误中,必须用单引号替换反引号,以使其在此处显示。

2 个答案:

答案 0 :(得分:0)

使用\yii\db\Expression

MODEL::find()
    ->where('1')
    ->orderBy(
        [
            new \yii\db\Expression('col_1 IS NULL ASC, col_1 desc')
        ]
    )
    ->all();

答案 1 :(得分:0)

NULLs最后的升序排列

使用减号运算符:

在MySQL中,NULL值被认为比任何非NULL值都低,除非在排序时在列名之前添加了-(减号)字符。

查询:

SELECT * FROM table     
ORDER BY -date_login DESC

使用Yii框架

Model::find()->orderBy([new \yii\db\Expression('-column_1 DESC')])->all();

使用IS NULL比较运算符:

我们可以依靠这样的事实:当表达式为1时,IS NULL返回NULL,否则返回0。有了这些信息,我们可以执行以下操作:

SELECT * FROM table     
ORDER BY column1 IS NULL, column1 ASC

使用Yii框架

Model::find()->orderBy([new \yii\db\Expression('column_1 IS NULL, column1 ASC')])->all();

使用COALESCE函数

也可以使用COALESCE函数,该函数返回指定参数列表中的第一个非NULL值(如果没有非NULL值,则返回NULL)。因此,要在对NULL值进行升序排序的同时对非NULL值进行升序排序,我们可以简单地提供尽可能高的值,作为NULL值的后备(或替代)值。

查询

SELECT * FROM table 
ORDER BY COALESCE(name, 'zz') ASC

之所以起作用是因为zee是字母表中的最后一个字母,默认情况下,MySQL会先对符号和数字进行排序,然后再对字母进行排序。因此,用字母zee的最高可能顺序替换NULL值会将NULL值推到列表的底部。

使用Yii框架

Model::find()->orderBy([new \yii\db\Expression("COALESCE(name, 'zz') ASC")])->all();

有关更多详细信息,请参见Here

相关问题