2009-10-16 4 views
-1

У меня есть база данных mySQL с некоторыми повторяющимися записями. У них одинаковый полевой телефон. Но у них также были поля, которые различаются. В примере у меня есть две записи с одним и тем же телефоном, но у первой записи есть отметка filed = default_value, а вторая запись имеет поле оценки = 5. Поэтому я должен объединить эти записи и только потом удалить дубликаты ...Объединить, а затем удалить дубликаты записей

Более распространенный пример:

entry1.phone==123 
entry1.phone==etry2.phone 
    entry1.rating!=entry2.phone 
    entry1.rating==default_value(0) 
    entry2.rating==5 
    merge 
    entry1.phone==123 
    entry1.rating==5 
    entry2 is deleted 
+0

Что вы просите? –

+0

Я спрашиваю, как это сделать ... sql-запрос или хранимая процедура ... – Oleksandr

+2

Но как бы вы определили, какую запись удалить? (Если они не являются точными дубликатами, но так, как вы просите, они не ...) –

ответ

1

Похоже, вам не нужно объединять записи, если вы просто пытаетесь обновить первую запись с рейтингом, отличным от стандартного. Я думаю, вы можете просто удалить записи с рейтингом по умолчанию.

Select a.* 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 


Delete a 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 

Если вы действительно должны обновить первую запись и удалить вторую запись, вы можете сделать что-то подобное, если у вас есть автоинкрементный ID. Следующий пример - это то, что я сделал бы, чтобы обновить первую запись, если существует идентификатор. Это является надежным, если вы только один раз дублируете номера телефонов.

Update a 
Set a.Rating = b.Rating 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 
    and a.ID < b.ID 


Delete a 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating = b.Rating 
    and b.ID > a.ID 

Надеюсь, это поможет.

-Ranthalion

2

Я не думаю, что вы можете сделать это в SQL эффективно. Один медленный способ сделать это - это что-то вроде:

CREATE TEMPORARY TABLE tmp_table (...); 
INSERT INTO tmp_table SELECT phone, max(rating) FROM table GROUP BY phone; 
TRUNCATE table; 
INSERT INTO table SELECT * FROM tmp_table; 

Лучшим способом может быть хранимая процедура или внешний скрипт. Выделите все строки из таблицы, упорядоченной по phone, и выполните группировку/слияние/удаление вручную (выполните итерацию по результатам, сравните значение phone из предыдущей строки, если оно отличается от новой группы и т. Д.). Написание хранимых процедур в MySQL - это больно, поэтому я не буду писать код для вас. :)

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