yii2 case find_in_set when 1 else 0 end
时间: 2024-02-01 22:13:59 浏览: 23
在 Yii2 中,您可以使用 ActiveQuery::where() 方法来构建 SQL 查询。要使用类似于 MySQL 中的 FIND_IN_SET 函数,您可以编写以下代码:
```php
use yii\db\Expression;
$query = YourModel::find()
->where(new Expression('FIND_IN_SET(:value, yourColumn) = 1', [':value' => $value]));
```
这里,我们使用 `yii\db\Expression` 类来编写原始 SQL 表达式。`FIND_IN_SET` 函数返回一个数字,表示在给定字符串列表中是否找到了指定值。如果找到,则返回该值在列表中的位置,否则返回 0。
我们使用 `= 1` 来测试函数结果是否为真,因为非零数字在 PHP 中被认为是 true,而零被认为是 false。
请注意,您需要将 `$value` 替换为要查找的值,并将 `yourColumn` 替换为您要查询的列名。
相关问题
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 when find_in_set then else end 排序
可以使用 `orderBy` 方法实现 `FIND_IN_SET` 函数的排序。
例如,假设你有一个 `items` 表,其中有一个 `tags` 字段,它包含了以逗号分隔的标签列表。如果你想按照标签匹配度对查询结果进行排序,可以使用以下代码:
```php
$query = \app\models\Items::find()
->select(['*', 'FIND_IN_SET("tag1", tags) AS tag1_match'])
->orderBy(['tag1_match' => SORT_DESC]);
```
这里的 `FIND_IN_SET("tag1", tags)` 用来计算 `tag1` 在 `tags` 字段中的位置,如果没有匹配到则返回 0。`tag1_match` 字段则用来保存计算结果,我们通过 `orderBy` 方法将结果按照 `tag1_match` 字段进行倒序排序。
你可以将 `tag1` 替换为你所需要匹配的标签。如果需要同时匹配多个标签,可以将它们用逗号分隔,并使用 `SUM` 函数计算它们在 `tags` 字段中的位置之和。例如:
```php
$query = \app\models\Items::find()
->select(['*', 'SUM(FIND_IN_SET("tag1", tags), FIND_IN_SET("tag2", tags)) AS tags_match'])
->orderBy(['tags_match' => SORT_DESC]);
```
这里的 `SUM(FIND_IN_SET("tag1", tags), FIND_IN_SET("tag2", tags))` 用来计算 `tag1` 和 `tag2` 在 `tags` 字段中的位置之和。注意,这里使用的是逗号分隔,而不是竖线分隔。