ORDER BY CASE WHEN cut_off_status = 1 THEN 0 WHEN cut_off_status = 2 THEN 1 ELSE 2 END, CASE WHEN cut_off_status = 1 THEN update_time DESC WHEN cut_off_status = 2 THEN confirm_time ASC ELSE create_time ASC END; 这句sql是什么意思
时间: 2023-06-26 13:04:09 浏览: 51
这段 SQL 语句表示对结果集按照两个条件进行排序:
1. 首先按照 `cut_off_status` 字段的值进行排序,如果值为 1,则排在最前面,如果值为 2,则排在第二个,否则排在最后一个。
2. 其次,在第一条件相同的情况下,按照不同的情况进行排序:
- 当 `cut_off_status` 的值为 1 时,按照 `update_time` 字段进行降序排序。
- 当 `cut_off_status` 的值为 2 时,按照 `confirm_time` 字段进行升序排序。
- 当 `cut_off_status` 的值既不是 1 也不是 2 时,按照 `create_time` 字段进行升序排序。
这段 SQL 语句的作用是对一个表中的记录进行排序,使得满足 `cut_off_status` 字段为 1 的记录排在最前面,其次是 `cut_off_status` 为 2 的记录,最后是 `cut_off_status` 既不是 1 也不是 2 的记录,并且在每个分组内按照不同的字段进行排序。
相关问题
yii2 case when find_in_set then else end 排序
如果你需要在 `FIND_IN_SET` 函数之外使用更复杂的逻辑,可以结合 `CASE WHEN` 和 `ELSE` 子句来实现。
例如,假设你有一个 `items` 表,其中有一个 `tags` 字段,它包含了以逗号分隔的标签列表。你想按照以下规则对查询结果进行排序:
- 如果 `tags` 中包含 `tag1`,则按照 `tag1` 在 `tags` 中的位置进行排序;
- 如果 `tags` 中不包含 `tag1`,但包含 `tag2`,则按照 `tag2` 在 `tags` 中的位置进行排序;
- 如果 `tags` 中既不包含 `tag1`,也不包含 `tag2`,则按照 `id` 字段进行排序。
你可以使用以下代码实现:
```php
$query = \app\models\Items::find()
->select([
'*',
'CASE
WHEN FIND_IN_SET("tag1", tags) != 0 THEN FIND_IN_SET("tag1", tags)
WHEN FIND_IN_SET("tag2", tags) != 0 THEN FIND_IN_SET("tag2", tags)
ELSE id
END AS tags_order'
])
->orderBy(['tags_order' => SORT_ASC]);
```
这里的 `CASE WHEN` 子句用来判断 `tags` 中是否包含 `tag1` 和 `tag2`,如果包含则返回它们在 `tags` 中的位置,否则返回 `id` 字段。`tags_order` 字段则用来保存计算结果,我们通过 `orderBy` 方法将结果按照 `tags_order` 字段进行排序。
你可以根据自己的需要修改 `CASE WHEN` 子句中的逻辑和条件。注意,在使用 `CASE WHEN` 子句时,要保证返回的数据类型一致,否则可能会导致排序错误。
yii2 case find_in_set when 1 else 0 end 排序
在 Yii2 中使用 `find_in_set` 函数进行排序可以使用以下代码:
```php
$query = MyModel::find()
->orderBy([
"find_in_set($value, column_name) DESC",
"other_column_name ASC",
]);
```
其中,`$value` 是需要查找的值,`column_name` 是需要在其中查找 `$value` 的字段名。`find_in_set` 函数会返回 `$value` 在 `column_name` 中的位置,如果不存在则返回 0。因此,我们可以使用 `find_in_set` 函数进行倒序排序,这样在 `column_name` 中存在 `$value` 的记录会排在前面。
如果需要在 `$value` 不存在于 `column_name` 中的记录中,将这些记录排在前面,可以使用 `when` 函数进行判断,代码如下:
```php
$query = MyModel::find()
->orderBy([
"(case when find_in_set($value, column_name) then 1 else 0 end) DESC",
"other_column_name ASC",
]);
```
这样,`find_in_set` 函数返回 0 的记录会被当作 `false`,返回非 0 的记录会被当作 `true`。通过 `when` 函数进行判断,如果返回 `true`,则会按照逆序排序,否则按照正序排序。