您的位置:首页 > 数据库 > MySQL

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

2017-01-05 11:29 561 查看
在开发中有时会使用到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`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 数据库 php
相关文章推荐