所以我有两个表,一个持有所有用户,另一个持有用户及其相应的组。我想要做的是让第二个表中的所有用户id从第一个表中获取我需要的所有信息。我的解释有点乱,但我认为下面的代码应该足够清楚
SELECT
*
FROM
USER
WHERE
id IN (
SELECT
group_concat(userid)
FROM
user_membership
WHERE
groupid = 45
);
然而,返回的是空集。当我更换' in'用' ='它返回一个条目(如预期的那样)。我的语法有什么问题?感谢。
答案 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
;
这应该运行得更快,因为查询可以更容易地使用索引