在group_concat中使用in

时间:2016-08-30 06:08:59

标签: mysql

所以我有两个表,一个持有所有用户,另一个持有用户及其相应的组。我想要做的是让第二个表中的所有用户id从第一个表中获取我需要的所有信息。我的解释有点乱,但我认为下面的代码应该足够清楚

SELECT
    *
FROM
    USER
WHERE
    id IN (
        SELECT
            group_concat(userid)
        FROM
            user_membership
        WHERE
            groupid = 45
    );

然而,返回的是空集。当我更换' in'用' ='它返回一个条目(如预期的那样)。我的语法有什么问题?感谢。

4 个答案:

答案 0 :(得分:3)

您在此处不需要group_concat(),因为它会将每个userid连接到一个字符串列中,您需要将每个 user.id与一个{{}进行比较1}}值,而不是整个集合。执行该操作实在是太过分了。

简单选择就足够了。但是,使用user_membership.userid重写查询可能会更有效:

EXISTS

如果您真的坚持使用select * from user u where exists ( select 1 from user_membership um where u.id = um.userid and groupid = 45 ) 子句,那么正确的查询将会显示:

IN

答案 1 :(得分:1)

您可以使用FIND_IN_SET

SELECT
 *
FROM USER
WHERE
FIND_IN_SET(id ,( SELECT group_concat(userid) FROM user_membership WHERE groupid = 45 ))

您可以使用INNER JOIN

SELECT
    U.*
FROM USER U 
INNER JOIN user_membership UM ON UM.userid = U.id 
WHERE UM.groupid = 45

或者你可以像他的回答中提到的EXISTS一样使用卡米尔G.

答案 2 :(得分:0)

group_concat是一个数字,SELECT * FROM USER WHERE ( SELECT CONCAT(',', CONCAT(group_concat(userid), ',')) FROM user_membership WHERE groupid = 45 ) LIKE CONCAT(',', CONCAT(id, ',')); 返回一个字符串,其中包含以逗号分隔的所有ID。我不知道您遇到的行为的原因,但我相信您可以解决这个问题:

LIKE

说明:我们在内部结果的开头和结尾写逗号,以允许EXISTS拥有一般操作符。但是,如果您使用SELECT * FROM USER WHERE EXISTS ( SELECT 1 FROM user_membership WHERE user_membership.groupid = 45 and user_membership.userid = USER.id );

,则可以优化您的查询
gesture

答案 3 :(得分:0)

看起来更像是一个加入的工作

SELECT
    *
FROM
    USER u inner join 
     user_membership m on m.userid = u.id
WHERE
         m.groupid = 45
   ;

这应该运行得更快,因为查询可以更容易地使用索引