今天做用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查询

解决方案 »

  1.   


        在用户只有单角色时使用
        WHERE a.GROUPID = (SELECT m.GROUPID FROM MASTERGROUP m WHERE m.MASTERID='4')
        也是可以的。但是用户有多角色时就不行了。
      

  2.   

    MASTERGROUP表中GROUPID内容是什么?
    如果是'1,2,3,4,5,6
    这种形式,参考INSTR、FIND_IN_SET 函数
      

  3.   


    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';
    成功了。谢谢大神
      

  4.   


    但是当用户有多角色时会报SQL Error (1242): Subquery returns more than 1 row
      

  5.   

    SELECT m.GROUPID FROM `MASTERGROUP` m WHERE m.MASTERID='4'是这句?
    SELECT group_concat(m.GROUPID FROM) `MASTERGROUP` m WHERE m.MASTERID='4'
      

  6.   


    完全解决了。再次膜拜大神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';