2016-03-14 4 views
0

В MySQL db у меня есть строки. Например:Как найти дубликаты mysql в двух зеркальных столбцах

Varchar1 | Varchar2  
XXXXXXXXXX YYYYYYYYYY 
YYYYYYYYYY XXXXXXXXXX 
XXXXXXXXXX CCCCCCCCCC 
YYYYYYYYYY AAAAAAAAAA 
CCCCCCCCCC AAAAAAAAAA 

Как можно найти (и удалить) дубликаты в строках 1 и 2?

Нельзя удалять одну строку (1 или 2).

+0

почему строка 1 и строки 2 дубликатов? –

+0

Дайте реальный пример plz ... if id не имеет значения, укажите первичный ключ вашей таблицы или уникальный индекс, который позволяет различать строки. –

ответ

0

решена. У меня есть значение BIGINT с побитовым И хэш varchar1 и varchar2.

ALTER TABLE t1 ADD COLUMN hex1 BIGINT UNSIGNED NOT NULL; ALTER TABLE t1 ADD COLUMN hex2 BIGINT UNSIGNED NOT NULL; ALTER TABLE t1 ADD COLUMN hex BIGINT UNSIGNED NOT NULL; UPDATE t1 SET hex1 = CONV(SUBSTRING(CAST(SHA(varchar1) AS CHAR), 1, 16), 16, 10), hex2 = CONV(SUBSTRING(CAST(SHA(varchar2) AS CHAR), 1, 16), 16, 10), hex = hex1&hex2; ALTER TABLE t1 DROP COLUMN hex1; ALTER TABLE t1 DROP COLUMN hex2;

и группа с помощью шестигранной колонны

SELECT t1.* GROUP BY hex;

1
SELECT t1.id, t1.varchar1,t1.varchar2,t2.id, t2.varchar1,t2.varchar2 
from yourtable t1, yourtable t2 
where t1.id<>t2.id and t1.varchar1=t2.varchar2 

Попробуйте это и вернуться, если не работает :)

Если это извлекает данные, которые вы хотите, то удаление довольно легко:

DELETE from yourtable WHERE id in(SELECT t1.id from yourtable t1, yourtable t2 
    where t1.id<>t2.id and t1.varchar1=t2.varchar2) 

Предупреждение: используйте DELETE только если вы не находитесь в производственной среде, или если вы уверены в том, что делаете или находитесь внутри транзакции (BEGIN ...)

+0

извините. id - только для справки. Это поле не имеет значения. Два основных поля - Varchar1 и Varchar2. Если я делаю что-то вроде HEX (Varchar1) & HEX (Varchar2) как _hash'. Должна работать? – Kamik

+0

не работает, потому что 64-битное ограничение в mysql – Kamik

+0

ваше решение не совсем верно. В случае, если я удаляю строки 3 и 4, которые я бы не сделал. – Kamik

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