tp8 mysql中使用FIND_IN_SET查询在,逗号隔开的字符串中符合多个ID的数据

本文详细介绍了 MySQL 中的 FIND_IN_SET 函数及其应用场景,对比了它与 LIKE 模糊查询的区别,并通过实例展示了如何使用该函数进行精确匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TP8写法:

$result = Db::name('users')
    ->whereRaw("FIND_IN_SET($roleId, roles)")
    ->select();

$result = Db::name('users')
    ->where(function ($query) use ($roleId) {
        $query->whereRaw("FIND_IN_SET($roleId, roles)");
    })
    ->select();

$result = Db::name('users')
    ->where(function ($query) use ($roleId) {
        $query->whereRaw("FEND_IN_SET($roleId, roles)");
    })
    ->where('status', 'active')
    ->select();

模型类中使用

namespace app\model;

use think\Model;

class User extends Model
{
    public function getUsersByRoleId($roleId)
    {
        return $this->where(function ($query) use ($roleId) {
            $query->whereRaw("FIND_IN_SET($roleId, roles)");
        })->select();
    }
}

// 在控制器中调用模型方法
$userModel = new \app\model\User();
$roleId = 3;
$users = $userModel->getUsersByRoleId($roleId);
foreach ($users as $user) {
    // 处理查询结果
    var_dump($user);
}

原生写法:

FIND_IN_SET(str,strlist)函数   它不同于 like 模糊查询,它是以“,”来分隔值

str 要查询的字符串

strlist 字段名 参数以”,”分隔 如 (1,2,6,8)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录

下面举例说明

test表中有如下字段及值

下面我想查询area中包含”1″这个参数的记录

SELECT * from test where FIND_IN_SET('1',area)

返回值

下面查询btype字段中包含”15″这个参数的值

SELECT * from test where FIND_IN_SET('15',btype)

返回值

FIND_IN_SET和like的区别

like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。

举个例子来说: 

有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 

现在有篇文章他既是 头条,又是热点,还是图文, 

type中以 1,3,4的格式存储. 

们我们如何用sql查找所有type中有4图文标准的文章呢?? 


这就要我们的find_in_set出马的时候到了. 

以下为引用的内容: 

select * from article where FIND_IN_SET('4',type) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值