【问题标题】:Filtering out unique rows in MySQL过滤掉MySQL中的唯一行
【发布时间】:2011-02-09 07:06:41
【问题描述】:

所以我有大量的 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

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

编辑:澄清一下,我对被过滤掉的配对不感兴趣,我需要所有配对的行> 独一无二。

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

How to select non "unique" rows

【问题讨论】:

    标签: mysql select filter unique


    【解决方案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)
    

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

    【讨论】:

    • 这会返回唯一的行,但我需要唯一的行,并且HAVING num_of_users > 1 将重复的行混合在一起。
    • 叮叮叮,我们赢了!第二个版本相当快,并且似乎产生了正确的行。
    【解决方案2】:

    使用 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
    

    【讨论】:

    • 您的第一个解决方案有效,但在大约 2000 行的测试表上需要 7 秒;真实表有超过一百万个条目。第二个更快,但将重复的行混合在一起。
    • 从好的方面来说,至少我设法通过在第二个列中添加count(*) 列并将它们相加来计算出答案集的大小。
    • @jpatokal - 表上的索引是什么?
    • @jpatokal - 另外,尝试将 #1 和 #2 结合起来(例如,首先使用 #2 将唯一行提取到临时表中,然后将您的表连接到用户、src 和dst。它可能比 #1 更快,同样取决于索引。
    • user、src 和 dst 都被索引了,问题是当子查询的数据集很大时 WHERE EXISTS 非常慢。但 tiko 似乎已经找到了解决方案。
    【解决方案3】:

    可能会和一些团体在一起?

    类似

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

    【讨论】:

    • 这与 Tiko 的答案基本相同,并且还返回唯一行,而不是非唯一行。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2013-03-25
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多