我在cakePHP中有这段代码
$this->paginate = [
'sortWhitelist' => [
'Companies.name',
'Grants.shortname',
'amount',
'contact',
'LatestHistory.Histories__deadline',
'Statuses.name'
],
'order' => [
'LatestHistory.Histories__deadline' => 'ASC',
'Statuses.await' => 'DESC',
'Statuses.name'
]
];
按照历史截止日期ASC排序,但是空值首先出现,而其他记录的历史记录,其中历史记录截止日期不为空。如果ASC列表位于第一位,我想,而不是空值。我该如何解决这个问题?
由于
答案 0 :(得分:0)
尝试以下方法:
$this->paginate = [
'sortWhitelist' => [
'Companies.name',
'Grants.shortname',
'amount',
'contact',
'LatestHistory.Histories__deadline',
'Statuses.name'
],
'order' => [
'-LatestHistory.Histories__deadline' => 'DESC',
'Statuses.await' => 'DESC',
'Statuses.name'
]
];
注意LatestHistory.Histories__deadline
前面的减号和DESC
反转顺序。
MySQL Orderby a number, Nulls last中描述了这种技术。
答案 1 :(得分:0)
您可以在查询中使用两个order by
条件来执行此操作: -
ORDER BY LatestHistory.Histories__deadline is null, LatestHistory.Histories__deadline ASC
第一个order by
通过按语句返回true
或false
来对语句进行排序。
所以你的Cake paginate查询看起来像: -
$this->paginate = [
'sortWhitelist' => [
'Companies.name',
'Grants.shortname',
'amount',
'contact',
'LatestHistory.Histories__deadline',
'Statuses.name'
],
'order' => [
'LatestHistory.Histories__deadline is null',
'LatestHistory.Histories__deadline' => 'ASC',
'Statuses.await' => 'DESC',
'Statuses.name'
]
];
或者使用CASE WHEN
: -
ORDER BY CASE WHEN LatestHistory.Histories__deadline IS NOT NULL THEN 1 ELSE 2 END, LatestHistory.Histories__deadline ASC