过滤掉MySQL中的唯一行

时间:2011-02-09 07:06:41

标签: 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)对(即使该用户有重复项),只留下那些属于多个用户的对:< / p>

user | src | dst
1    | 1   | 1
1    | 1   | 1
2    | 1   | 1

换句话说,对(1,2)对用户1是唯一的,对用户2是对(1,3),所以它们被丢弃,只留下对(1,1)的所有实例。

修改:为了澄清,我对过滤掉的对不感兴趣,我需要所有不独特。

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

How to select non "unique" rows

3 个答案:

答案 0 :(得分: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)

MIGHT工作的另一个选项(没有测试)。如果它有效,它将更有效:

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

答案 1 :(得分:1)

我的解决方案就是这样(经过测试):

SELECT user, src, dst, COUNT(user) as num_of_users
FROM test
GROUP BY src, dst
HAVING num_of_users = 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)

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

答案 2 :(得分:0)

可能与某些小组在一起吗?

类似

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