过滤出MySQL中唯一的行

过滤出MySQL中唯一的行,mysql,select,filter,unique,Mysql,Select,Filter,Unique,我有大量的SQL数据,基本上如下所示: user | src | dst 1 | 1 | 1 1 | 1 | 1 1 | 1 | 2 1 | 1 | 2 2 | 1 | 1 2 | 1 | 3 我想过滤掉一个用户独有的(src,dst)对(即使该用户有重复项),只留下属于多个用户的对: user | src | dst 1 | 1 | 1 1 | 1 | 1 2 | 1 | 1 换句话说,pair(1,

我有大量的SQL数据,基本上如下所示:

user | src | dst
1    | 1   | 1
1    | 1   | 1
1    | 1   | 2
1    | 1   | 2
2    | 1   | 1
2    | 1   | 3
我想过滤掉一个用户独有的(src,dst)对(即使该用户有重复项),只留下属于多个用户的对:

user | src | dst
1    | 1   | 1
1    | 1   | 1
2    | 1   | 1
换句话说,pair(1,2)对于用户1是唯一的,pair(1,3)对于用户2是唯一的,因此它们被删除,只留下pair(1,1)的所有实例

编辑:为了澄清,我对过滤掉的对不感兴趣,我需要所有对不唯一的行

有什么想法吗?下面问题的答案可以找到非唯一对,但我的SQL fu不足以处理要求它们也属于多个用户的复杂问题


可能是某个小组的成员

差不多

select user,src,dst,count(*) as c from table group by user,src,dst 
having c = 1

使用EXISTS语法连接

SELECT t1.*
FROM   table t1
WHERE EXISTS (SELECT 1 
              FROM   table t2 
              WHERE  t1.src   = t2.src 
               AND   t1.dst   = t2.dst
               AND   t1.user != t2.user)
另一个可能有效的选项(未测试)。如果它能起作用,效率会更高:

SELECT user, src, dst
FROM   table
GROUP BY src, dst
HAVING COUNT(DISTINCT user) > 1

我的解决方案如下(经过测试):

编辑: 下面的代码生成您在示例中提供的结果

SELECT test.user, test.src, test.dst
FROM test
INNER JOIN
(
    SELECT user, src, dst, COUNT(DISTINCT user) as num_of_users
    FROM test
    GROUP BY src, dst
    HAVING num_of_users > 1
) as inner_sql
USING(src, dst)

这个解决方案是您正在寻找的吗?性能如何?

这将返回唯一的行,但我需要不唯一的行,并且
拥有num\u users>1
将重复的行混合在一起。叮叮,我们有赢家了!第二个版本相当快,似乎生成了正确的行。您的第一个解决方案可以工作,但在一个包含约2000行的测试表上需要7秒钟;真正的表有50多万个条目。第二个要快得多,但将重复的行混在一起。好的一面是,至少我通过在第二个列中添加一个
count(*)
列并对它们进行汇总来计算出答案集的大小。@jpatokal-表上的索引是什么?@jpatokal-另外,尝试将#1和#2结合起来(例如,首先使用#2将唯一行提取到临时表中,然后将您的表连接到user、src和dst上的临时表。这可能比#1快,同样取决于索引。user、src和dst都被索引,问题是当子查询的数据集很大时,WHERE EXISTS的速度非常慢。但是tiko似乎已经达到了o这与Tiko的答案基本相同,并且返回唯一行,而不是非唯一行。
SELECT test.user, test.src, test.dst
FROM test
INNER JOIN
(
    SELECT user, src, dst, COUNT(DISTINCT user) as num_of_users
    FROM test
    GROUP BY src, dst
    HAVING num_of_users > 1
) as inner_sql
USING(src, dst)