2015-04-23 3 views
0

У меня есть базы данных MySQL, аналогичную:SQL находкой строки дублирует

+----+---------+---------+------------------+.... 
| id | unique1 | unique2 | genaric_data |.... 
+----+---------+---------+------------------+.... 
| 0 | 100 | 1C7 | {data container} |.... 
+----+---------+---------+------------------+.... 
| 1 | 100 | 1C7 | {data container} |.... 
+----+---------+---------+------------------+.... 
| 2 | 100 | 1C8 | {data container} |.... 
+----+---------+---------+------------------+.... 
| 3 | 101 | --- | {data container} |.... 
+----+---------+---------+------------------+.... 
| 4 | 102 | 0  | {data container} |.... 
+----+---------+---------+------------------+.... 
| 5 | 103 | 1  | {data container} |.... 
................................................. 

мне нужен способ, чтобы добавить дополнительный столбец, который дает число раз используются все уникальные поля. Затем мне нужно будет вручную очистить данные.

Я хочу, чтобы запрос, чтобы вернуться:

+----+---------+---------+------+------------------+.... 
| id | unique1 | unique2 | dupe | genaric_data |.... 
+----+---------+---------+------+------------------+.... 
| 0 | 100 | 1C7 | 2 | {data container} |.... 
+----+---------+---------+------+------------------+.... 
| 1 | 100 | 1C7 | 2 | {data container} |.... 
+----+---------+---------+------+------------------+.... 
| 2 | 100 | 1C8 | 1 | {data container} |.... 
+----+---------+---------+------+------------------+.... 
| 3 | 101 | --- | 1 | {data container} |.... 
+----+---------+---------+------+------------------+.... 
| 4 | 102 | 0  | 1 | {data container} |.... 
+----+---------+---------+------+------------------+.... 
| 5 | 103 | 1  | 1 | {data container} |.... 
....................................................... 

Это была проблема, которую я имел некоторое время, и в настоящее время мое единственное решение для экспорта данных в Exсel и использовать его, чтобы найти дубликаты.

Спасибо.

Edit: Возможный дубликат не является решением моей проблемы, так как когда я исполню:

SELECT *,count(*) FROM `database` 
GROUP BY `unique1` 
HAVING count(*) > 1 

На PhpMyAdmin (Все, что я имею право доступа к) он сливает ничего с той же unique1 в одну строку ,

+3

Просто используйте 'GROUP BY unique2' вместе с' SELECT COUNT (*) ', а затем' JOIN' обратно к столу, вы уже –

+0

возможный дубликат [ mysql count duplicates] (http://stackoverflow.com/ques/5120056/mysql-count-duplicates) –

+0

Я попытался использовать группу по и подсчитывать, это действительно дает мне желаемый эффект, но также не оставляет строки раздельными в запросе – theshadow124

ответ

3

Решение вашей проблемы заключается в использовании GROUP BY:

SELECT unique1, unique2, Count(*) As colCount FROM YourTable 
GROUP BY unique1, unique2 
HAVING Count(*) > 1 

Это вернет все комбинации unique1 и unique2, которые происходят более чем один раз.

На втором этапе вы можете создать запрос, который возвращает все затронутые строки.

SELECT YourTable.*, rstDuplicates.colCount 
FROM YourTable INNER JOIN (
    SELECT unique1, unique2, Count(*) As colCount FROM YourTable 
    GROUP BY unique1, unique2 
    HAVING Count(*) > 1 
) As rstDuplicates ON YourTable.unique1 = rstDuplicates.unique1 And YourTable.unique2 = rstDuplicates.unique2 

Это выведет все строки, содержащие по крайней мере один дубликат. Столбец colCount показывает количество выступлений.

+0

Спасибо! Это сработало! – theshadow124

1

Если вы хотите, чтобы добавить поле с информацией, коррелированный подзапрос, пожалуй, самый простой способ:.

select t.*, 
     (select count(*) 
     from table t2 
     where t2.unique1 = t.unique1 and t2.unique2 = t.unique2 
     ) as dupecnt 
from table t; 

Иногда это эффективно (с индексом на unique1, unique2 Иногда, это более эффективно сделать агрегацию в предложении from:.

select t.*, t2.dupecnt 
from table t join 
    (select unique1, unique2, count(*) as dupecnt 
     from table t2 
     group by unique1, unique2 
    ) t2 
    on t2.unique1 = t.unique1 and t2.unique2 = t.unique1 
+1

Это тоже сработало, но я могу отметить только один ответ, и я не видел его до тех пор, пока не пометил ответ «Заговор». Спасибо за ваш ответ! – theshadow124

+1

@ theshadow124. , , Как OP вы имеете право (и ответственность) принимать ответ - и это ваш выбор. Я не чувствовал, что это действительно ответили на ваш вопрос, потому что у него нет метода добавления «1» в столбец дубликатов. –

Смежные вопросы