4

我正在对表进行排序以显示状态为 3 的记录,然后是状态为 4 和 1 的记录。

在当前表中,这是输出

id    status
 1     3
 2     4
 3     4
 4     3
 5     1

现在当我应用查询时

select * from table order by model.status desc 

输出是:

id    status
 2     4
 3     4
 1     3
 4     3
 5     1

我想要的实际上是下面的输出。首先是状态 3,然后是状态 4,然后是状态 1。如何实现以下输出

id    status
 1     3
 4     3
 2     4
 3     4
 5     1
4

7 回答 7

5

而不是一个神奇的 9999999 数字,你可以使用 ~0,它代表 big int 的最大可能值......应该足够了;)

order by (case when status = 1 then ~0 else status end) 

其他解决方案,没有任何幻数

order by status = 1 , status

它将首先按“布尔值”(DB 中的 0 或 1)排序,然后按状态排序

于 2012-10-07T07:18:56.663 回答
3

你可以FIELD在 MySQL 上轻松做到这一点;

SELECT * 
FROM model
ORDER BY FIELD(status, 3, 4, 1);

SQLfiddle 在这里

于 2012-10-07T07:24:04.830 回答
3

如果FIELD不适合您(可能是由于旧版本的 MySql),那么试试这个。它会工作

SELECT * FROM model
ORDER BY CASE status WHEN 3 THEN 1  WHEN 4 THEN 2  WHEN 1 THEN 3
END, id

检查它在这个链接上的工作

于 2012-10-07T07:47:29.020 回答
1

使用 SQLFIELD

SELECT * FROM `table` ORDER BY FIELD (status, 3, 4, 1);
于 2012-10-07T07:14:27.037 回答
1

以下应该工作

 ORDER BY  CASE status WHEN 3 THEN 1
                 WHEN 4 THEN 2
                 WHEN 1 THEN 3
                 END, id asc
于 2012-10-07T07:25:52.870 回答
1
$invoiceList = InvoicesModel::where('hotel_id', $hotel_id)
                        ->where('status', 'PENDING')
                        ->orWhere('status', 'COOKING_PROCESS')
                        ->orderBy(
                            DB::raw('(CASE WHEN status = "COOKING_PROCESS" 
                            THEN 1 WHEN status = "PENDING"
                            THEN 2 END)')
                        )->get();
于 2020-08-23T02:58:01.120 回答
0

如果状态值仅为 1,3 和 4,则按子句顺序使用“ FIELD() ”。

select * from table order by FIELD( model.status 3,4,1)
于 2012-10-07T07:26:11.680 回答