2017-01-10 85 views
0

我有喜欢的表:membership_id | user_id | group_idSQL计数WHERE子句

enter image description here

我正在寻找一个SQL查询来获取公共组的2个不同的用户之间的数。我可以在几个查询中做到这一点,并使用一些PHP,但我想知道是否有一种方法只使用SQL。

像与用户ID 1和3,有3个共同组(1,5和6),所以返回的结果将是3

我做了一些测试,但至今没有结果.. 。谢谢。

回答

1

你不需要“多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 
); 
+0

谢谢你的作品! :)只是,如果你有20秒,这部分的目的是什么:拥有COUNT(DISTINCT user_id)= 2?再次感谢您 – 2Fwebd

+1

如果没有HAVING,您会得到与* * *用户关联的每个group_id。 '= 2'确保组与两个用户相关联,而'distinct'就是为了防止用户组关联不唯一(即,如果用户1与其关联两次,并且您不能获得组4 3根本没有关联)。 – Uueerdo

+0

谢谢,清楚的是! – 2Fwebd

1

您可以通过连接来实现此目的。如果你不想串接输出

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; 
0

尝试加入同一个表的两个实例(为他们每个人只选择记录

试试这个相对于使用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; 
0
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; 
+1

最好在代码中包含一些上下文/解释,因为这样可以使OP对未来的读者更有用。 – EJoshuaS