Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 找到相同的对集_Mysql_Sql - Fatal编程技术网

Mysql 找到相同的对集

Mysql 找到相同的对集,mysql,sql,Mysql,Sql,我在mysql中有这样的方案: 表A(id整数主键、pid整数、中间整数) 例数据: id | pid | mid 1 | 2 | 2 2 | 2 | 4 3 | 3 | 4 4 | 4 | 2 5 | 4 | 4 6 | 3 | 2 7 | 3 | 5 我有一些mid的pid,并希望找到所有具有相同mid集的pid。在pid=2的示例中,答案是2,4 小组讨论不适合我

我在mysql中有这样的方案:

表A(id整数主键、pid整数、中间整数)

例数据:

id  |  pid  |  mid  
1   |  2    |   2
2   |  2    |   4
3   |  3    |   4
4   |  4    |   2
5   |  4    |   4
6   |  3    |   2
7   |  3    |   5
我有一些mid的pid,并希望找到所有具有相同mid集的pid。在
pid=2
的示例中,答案是
2,4

小组讨论不适合我

我想应该很简单,但我找不到答案

UPD: 我试过
组\u concat

SELECT DISTINCT(b.pid) FROM (SELECT pid, group_concat(mid) as concated FROM TableA where pid=100293) as a, (select pid, group_concat(mid) as concated, COUNT(1) as count FROM TableA group by pid) as b where a.concated=b.concated;

您可以使用此查询。它将为您提供逗号分隔的PID

select `mid`, group_concat(`pid`) from `tableA` group by `mid`;

在MySQL中,我将使用
group\u concat()

这解决了所有PID的一般问题。在MySQL中解决1 pid有点棘手(没有窗口函数),但您可以尝试:

select t.pid, t2.pid, count(*)
from t join
     t t2
     on t.mid = t2.mid and t2.pid = 2
group by t.pid, t2.pid
having count(*) = (select count(*) from t where t.pid = t.pid) and
       count(*) = (select count(*) from t where t.pid = t2.pid);

为此,您需要在
t(mid,pid)
t(pid)
上建立索引,因为您使用的是整数,而不是
group\u concat
,您可以为每个
pid
在不同的
mid
值上生成一个位掩码,并加入其中。接下来就是数学:

SELECT DISTINCT pid 
FROM (SELECT pid, sum(pow(2,mid)) as midmask FROM (SELECT distinct pid, mid FROM tableA) as t1a GROUP BY pid) as t1
    INNER JOIN  (SELECT pid, sum(pow(2,mid)) as midmask FROM (SELECT distinct pid, mid FROM tableA) as t2a GROUP BY pid) as t2
        ON t1.midmask = t2.midmask
如果每个
pid
mid
已经是不同的,那么可以去掉内部子查询

使用@GordonLinoff优秀的单子查询方法,其中GROUP_CONCAT仅用于主查询(这样就不会太贵)。我们使用可能更快的位掩码方法,而不是内部查询上的group_concat

结果:

+---------+-------------------+
| midmask | group_concat(pid) |
+---------+-------------------+
|      10 |               2,4 |
|      26 |                 3 |
+---------+-------------------+
显然,结果集中的midmask不是绝对必要的,但是如果您想查看有助于匹配的
mid
值,可以从位掩码中选择值


我正在使用位右移运算符来确保在中间掩码结果中设置了正确的位,否则将关闭1。如果您不关心midmask的输出,那么就不要为查询的
>1
部分操心。

您的问题不清楚。。你想要所有的pid都在(2,4)中间吗?显示你的查询。。基于样本数据提供的样本,请选择或使用同等样本,预期结果应为pids 2和4,因为两个pids具有相同的MID集(2,4)。这是正确的还是我误解了什么?是的,是正确的,谢谢。小组讨论太慢了。我用过它,时间大约是100万。我对
group_concat
的询问将在回答中。谢谢。我试试看!
SELECT midmask>>1, group_concat(pid) 
FROM (SELECT pid, sum(pow(2,mid)) as midmask FROM (SELECT distinct pid, mid FROM tableA) as t1a GROUP BY pid) as t1
GROUP BY midmask;
+---------+-------------------+
| midmask | group_concat(pid) |
+---------+-------------------+
|      10 |               2,4 |
|      26 |                 3 |
+---------+-------------------+