Mysql SQL计数使用多个WHERE子句的常见匹配数

Mysql SQL计数使用多个WHERE子句的常见匹配数,mysql,sql,Mysql,Sql,我有一个表,它有如下列:membership\u id | user\u id | group\u id 我正在寻找一个SQL查询,以获取两个不同用户之间的公共组数。我可以通过几个查询和一些PHP来实现这一点,但我想知道是否有一种方法可以只使用SQL来实现这一点 与用户ID 1和3一样,有3个公共组(1、5和6),因此返回的结果将是3 我做了几次测试,但到目前为止没有结果…谢谢 您可以通过join实现这一点 试试这个: select t1.user_id, t2.user_id, group_

我有一个表,它有如下列:
membership\u id | user\u id | group\u id

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

与用户ID 1和3一样,有3个公共组(1、5和6),因此返回的结果将是3


我做了几次测试,但到目前为止没有结果…谢谢

您可以通过join实现这一点

试试这个:

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;
选择t1.user\u id、t2.user\u id、group\u concat(不同的t1.group\u id)
从您的表t1
加入您的表t2
在t1.user\u 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;
选择不同的t1.user\u id、t2.user\u id、t1.group\u id
从您的表t1
加入您的表t2
在t1.user\u id
您可以通过join实现这一点

试试这个:

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;
选择t1.user\u id、t2.user\u id、group\u concat(不同的t1.group\u id)
从您的表t1
加入您的表t2
在t1.user\u 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;
选择不同的t1.user\u id、t2.user\u id、t1.group\u id
从您的表t1
加入您的表t2
在t1.user\u id
使用组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;

尝试使用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;
您不需要“多个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
);
您不需要“多个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
);

谢谢你的工作!:)只是,如果你有20秒,这部分的目的是什么:拥有COUNT(DISTINCT user_id)=2?再次感谢您如果没有,您将获得与任一用户关联的每个组id。
=2
确保组与两个用户都关联,而
不同的
只是为了防止用户组关联不唯一(即,如果用户1与组4关联两次,而3与组4根本没有关联,那么您就不会得到组4)。谢谢您的工作!)只是,如果你有20秒,这部分的目的是什么:拥有COUNT(DISTINCT user_id)=2?再次感谢您如果没有,您将获得与任一用户关联的每个组id。
=2
确保组与两个用户关联,而
不同的
只是为了防止用户组关联不唯一(即,如果用户1与组4关联两次,而3根本不与组4关联,则不会得到组4)。最好在代码中包含一些上下文/解释,因为这会使答案对OP和未来的读者更有用。最好在代码中包含一些上下文/解释,因为这会使答案对OP和未来的读者更有用。