MySQLにおいてorder byしたときにある特定データだけ順番を変えたいってときに便利な関数が FIELD

普通にid昇順で並べるとこう(rails consoleを通してSQLを発行)。

> User.order(:id).ids
   SELECT `users`.`id` FROM `users` ORDER BY `users`.`id` ASC
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

FIELD を使って id: 1 を例外として末尾に持っていきたいときのSQLはこう。

> User.order("FIELD(id, 1)").ids
   (1.9ms)  SELECT `users`.`id` FROM `users` ORDER BY FIELD(id, 1)
=> [2, 3, 4, 5, 6, 7, 8, 9, 1]

カンマで値を書き連ねればその順番通りに値が取得できる。

> User.order("FIELD(id, 1, 2)").ids
   (1.2ms)  SELECT `users`.`id` FROM `users` ORDER BY FIELD(id, 1, 2)
=> [3, 4, 5, 6, 7, 8, 9, 1, 2]

参考

MySQL :: MySQL 8.0 Reference Manual :: 12.8 String Functions and Operators