我有喜欢的表:membership_id | user_id | group_id
SQL计数WHERE子句
我正在寻找一个SQL查询来获取公共组的2个不同的用户之间的数。我可以在几个查询中做到这一点,并使用一些PHP,但我想知道是否有一种方法只使用SQL。
像与用户ID 1和3,有3个共同组(1,5和6),所以返回的结果将是3
我做了一些测试,但至今没有结果.. 。谢谢。
我有喜欢的表:membership_id | user_id | group_id
SQL计数WHERE子句
我正在寻找一个SQL查询来获取公共组的2个不同的用户之间的数。我可以在几个查询中做到这一点,并使用一些PHP,但我想知道是否有一种方法只使用SQL。
像与用户ID 1和3,有3个共同组(1,5和6),所以返回的结果将是3
我做了一些测试,但至今没有结果.. 。谢谢。
你不需要“多WHERE子句”,甚至自连接:
SELECT group_id
FROM theTable AS t
WHERE t.user_id IN (1, 3)
GROUP BY group_id
HAVING COUNT(DISTINCT user_id) = 2;
更一般
SELECT group_id
FROM theTable AS t
WHERE t.user_id IN ([user id list])
GROUP BY group_id
HAVING COUNT(DISTINCT user_id) = [# of user ids in list];
编辑:哦,你想要的组数....
SELECT COUNT(1) FROM (
SELECT group_id
FROM theTable AS t
WHERE t.user_id IN (1, 3)
GROUP BY group_id
HAVING COUNT(DISTINCT user_id) = 2
);
您可以通过连接来实现此目的。如果你不想串接输出
select t1.user_id, t2.user_id, group_concat(distinct t1.group_id)
from your_table t1
join your_table t2
on t1.user_id < t2.user_id
and t1.group_id = t2.group_id
group by t1.user_id, t2.user_id;
:
select distinct t1.user_id, t2.user_id, t1.group_id
from your_table t1
join your_table t2
on t1.user_id < t2.user_id
and t1.group_id = t2.group_id;
尝试加入同一个表的两个实例(为他们每个人只选择记录
试试这个相对于使用GROUP_ID作为连接属性,并计算结果中的一个用户):
SELECT COUNT(*)
FROM table AS t1
JOIN table AS t2 ON t1.group_id=t2.group_id
WHERE t1.user_id=1 AND t2.user_id=3;
SELECT COUNT(*)
FROM TABLE_NAME USER_ONE_INFO
TABLE_NAME USER_TWO_INFO
WHERE USER_ONE_INFO.ID = USER_ONE_ID
AND USER_TWO_INFO.ID = USER_TWO_ID
AND USER_ONE_INFO.GROUP_ID = USER_TWO_INFO.GROUP_ID;
最好在代码中包含一些上下文/解释,因为这样可以使OP对未来的读者更有用。 – EJoshuaS
谢谢你的作品! :)只是,如果你有20秒,这部分的目的是什么:拥有COUNT(DISTINCT user_id)= 2?再次感谢您 – 2Fwebd
如果没有HAVING,您会得到与* * *用户关联的每个group_id。 '= 2'确保组与两个用户相关联,而'distinct'就是为了防止用户组关联不唯一(即,如果用户1与其关联两次,并且您不能获得组4 3根本没有关联)。 – Uueerdo
谢谢,清楚的是! – 2Fwebd