尝试做类似于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'
注意:在上面的错误中,必须用单引号替换反引号,以使其在此处显示。
答案 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();
我们可以依靠这样的事实:当表达式为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
函数,该函数返回指定参数列表中的第一个非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