今天做用MySQL做查询的时候出了一个很诡异的错误。
查询的业务逻辑是从从用户-角色对照表MASTERGROUP查出用户拥有的角色(一个用户可拥有多个角色)。根据查出来的角色到角色-功能对照表ACTIONGROUP查询出功能。最后根据功能在ACTION功能表里查出功能和功能名称返回。查询语句如下:
SELECT ACTION,ACTIONNAME
FROM ACTION act
WHERE act.ACTION IN (
SELECT a.ACTION
FROM ACTIONGROUP a
WHERE a.GROUPID in (SELECT m.GROUPID FROM MASTERGROUP m WHERE m.MASTERID='4')
) AND act.VIEWMODE='Y';
整条语句会返回ACTION功能表的所有记录,并没有对条件进行筛选。 问题出在WHERE a.GROUPID in (SELECT m.GROUPID FROM MASTERGROUP m WHERE m.MASTERID='4')
如果改为WHERE a.GROUPID in (2)
结果就正确了。可是SELECT m.GROUPID FROM MASTERGROUP m WHERE m.MASTERID='4' 返回的结果也是2啊。为啥就出错了呢?求大神指点。
MySQLSQL查询
在用户只有单角色时使用
WHERE a.GROUPID = (SELECT m.GROUPID FROM MASTERGROUP m WHERE m.MASTERID='4')
也是可以的。但是用户有多角色时就不行了。
如果是'1,2,3,4,5,6
这种形式,参考INSTR、FIND_IN_SET 函数
SELECT ACTION,ACTIONNAME
FROM `ACTION` act
WHERE act.ACTION IN (
SELECT a.ACTION
FROM `ACTIONGROUP` a
WHERE FIND_IN_SET (a.GROUPID,(SELECT m.GROUPID FROM `MASTERGROUP` m WHERE m.MASTERID='4'))
) AND act.VIEWMODE='Y';
成功了。谢谢大神
但是当用户有多角色时会报SQL Error (1242): Subquery returns more than 1 row
SELECT group_concat(m.GROUPID FROM) `MASTERGROUP` m WHERE m.MASTERID='4'
完全解决了。再次膜拜大神SELECT ACTION,ACTIONNAME
FROM `ACTION` act
WHERE act.ACTION IN (
SELECT a.ACTION
FROM `ACTIONGROUP` a
WHERE a.GROUPID in (SELECT group_concat(m.GROUPID) FROM `MASTERGROUP` m WHERE m.MASTERID='2')
) AND act.VIEWMODE='Y';