Фильтрация уникальных строк в MySQL - PullRequest
1 голос
/ 09 февраля 2011

Итак, у меня есть большой объем данных 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-фу недостаточно, чтобы справиться со сложностью требования, что они также принадлежат нескольким пользователям.

Как выбрать не «уникальные» строки

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

Присоединиться, используя синтаксис 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
1 голос
/ 09 февраля 2011

Мое решение будет примерно таким (проверено):

SELECT user, src, dst, COUNT(user) as num_of_users
FROM test
GROUP BY src, dst
HAVING num_of_users = 1

Edit: Следующий код выдает результаты, которые вы предоставили в своем примере.

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)

Является ли это решение тем, которое вы ищете? Как производительность?

0 голосов
/ 09 февраля 2011

Может быть с какой-то группой?

что-то вроде

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