find order_by にて NULL値を持つデータを最後に持ってきたい場合の記述方法

254 views
Skip to first unread message

Ryosuke Yoshinari

unread,
Feb 4, 2016, 2:40:17 AM2/4/16
to fuelphp.jp
お世話になっております。


モデルのfindにおいて、order_by 句を使ってソートすると
NULL値が先頭に来てしまいますが、
これを最後に持ってきたいと考えております。

インターネットで検索してみたところ、MySQLでは

SELECT * FROM table ORDER BY created_at ASC;

これを

SELECT * FROM table ORDER BY created_at IS NULL ASC, created_at ASC;

このようにすれば、目的の順序でソートできると書いてありました。


Model_Customer::find('all',array(
 ...
'order_by' => array('entry_code' => 'IS NULL asc','entry_code' => 'asc'),
));

のようなことをやりたいのですが、このままではうまく動きません。

fuelphpでは、order_byを用いてソートするとき、
NULLを最後に持ってくるには、どのような記述をすればよいのでしょうか?

ttyk...@gmail.com

unread,
Feb 4, 2016, 3:09:09 AM2/4/16
to fuelp...@googlegroups.com
はじめまして。近藤と申します。

FuelPHPのお話しではなくSQLのお話しになってしまうのですが

SELECT *, ISNULL(created_at) AS flag
FROM table
ORDER BY flag ASC, created_at ASC;

とかいかがでしょうか。

このSQLを組み立てればうまくいかないでしょうか。

kit.t

unread,
Feb 4, 2016, 7:21:03 AM2/4/16
to fuelphp.jp
kittです。

安直に以下のようにしてもうまく動きません・・・
'entry_code' => DB::expr('IS NULL asc')

というのもクエリビルダーのorder句部分が、「null」か「ASC」でなければ「DESC」という実装になっているようです。
ここを修正してしまうのが手かと思います。


array(DB::expr(’entry_code IS NULL’) => 'ASC')
にすればよいかとも思ったのですが、
これは文法エラーになってしまいます。

結論として抜け道的に
array(DB::expr(’entry_code IS NULL’))
なら一応は期待通りのソートができることになります。
注意が必要な実装だと思います。

2016年2月4日木曜日 16時40分17秒 UTC+9 Ryosuke Yoshinari:

Ryosuke Yoshinari

unread,
Feb 7, 2016, 8:46:02 PM2/7/16
to fuelphp.jp
 kittさん
近藤さん
ありがとうございました。

仰ったとおりにやってみたのですが、
array(DB::expr(’entry_code IS NULL’))

結果がうまくいかず、

1
2
3
4
NULL
5
6
7
8
9
NULL
NULL
NULL

などのようになってしまい原因がはっきりしません。

もう少し調べてみます。

 
Reply all
Reply to author
Forward
0 new messages