过滤出MySQL中唯一的行
我有大量的SQL数据,基本上如下所示:过滤出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,
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)