mysql выбирает строки на основе парных значений из оператора IN - PullRequest
0 голосов
/ 03 марта 2012

В основном я хотел бы сделать:

SELECT * FROM `table` 
WHERE ( `col1`, `col2`) 
IN 
[
    SELECT `col1`, `col2` 
    FROM `table` 
    GROUP BY `col1`, `col2` 
    HAVING count(*) >1
]

Я бы хотел выбрать все уникальные дубликаты и их фактические дубликаты. но как я могу сохранить отношения между col1 и col2, относящиеся к запросу IN?

я знаю, что есть и другие способы сделать это.

один из методов - создание фиктивной таблицы, перемещение в нее всех соответствующих записей и замена оригинала.

другой использует соединение как:

SELECT * 
FROM table t1 
JOIN table t2 
ON t1.id > t2.id 
AND t1.col1 = t2.col1 
AND t1.col2 = t2.col2;

но это займет около 10 минут: \

1 Ответ

1 голос
/ 03 марта 2012

Это покажет все дубликаты, отсортированные вместе:

SELECT 
    t.* 
FROM 
        tableX  AS t
    JOIN 
        ( SELECT col1, col2 
          FROM tableX 
          GROUP BY col1, col2 
          HAVING COUNT(*) > 1
        )  AS td
      ON (td.col1, td.col2) = (t.col1, t.col2)
ORDER BY 
    t.col1, t.col2

Индекс на (col1, col2) поможет вышеупомянутому - и также ваша версия Join.

...