解决mysql的in条件中参数是带引号的字符串的时候查询失效

13 篇文章 1 订阅

在开发中有时会使用到in查询,并且里面的参数又是数据库中的一个字段,比如如下错误的例子


SELECT
    `ag`.`id`,
    `ag`.`rules`,
    (
        SELECT 
            GROUP_CONCAT(ar.title)
        FROM
            auth_rule ar 
        WHERE 
            ar.id IN (ag.rules)
    ) as rulesName
FROM
    `auth_group` `ag`

上面语句查询的表是常用的后台权限表,表数据如下:

这里写图片描述

上面查询角色拥有的规则名称,但是这里传进去的是ag.rules,其实这个字段传进去实际上在数据库是这样查询的(多了个引号):

ar.id IN ('4,3')

而不是

ar.id in (4,3)

在mysql中in里面如果是字符串的话,会自动转化成int类型的,内部使用了如下方法:

CAST('4,3' AS INT)

强转之后’4,3’会变成4,所以查询出来的结果只是一条而已。这个问题其实可以使用另外一个mysql的函数来解决:

FIND_IN_SET('查询的值(如:1)', '使用逗号隔开的字符串集合,如:('1,2,3')')

正确的sql语句如下:

SELECT
    `ag`.`id`,
    `ag`.`title`,
    `ag`.`status`,
    `ag`.`rules`,

    (
        SELECT 
            GROUP_CONCAT(ar.title)
        FROM
            auth_rule ar 
        WHERE 
            FIND_IN_SET(ar.id,ag.rules)
    ) as rulesName
FROM
    `auth_group` `ag`
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值