2015-11-30 2 views
1

У меня есть база данных MySQL PHPMyAdmin, где я случайно добавил две одинаковые части. Для меня они дубликаты, но с точки зрения фактических данных они не являются. Есть несколько столбцов в таблице part_lists:Как избавиться от аналогичных дубликатов от MySQL

+-----+---------------------------+----------+ 
| id |  Part Name  | Quantity | 
+-----+---------------------------+----------+ 
| 1 | Part A (1/4")    |  0 | 
| 2 | Part B     |  3 | 
| 3 | Part D     |  4 | 
| 4 | Part E     |  9 | 
| ... | a lot of part names later | ... | 
| 95 | Part A (1/4") (0 free) |  4 | <-- newly appended 
| 96 | Part B (-1 free)   |  5 | <-- newly appended 
| 97 | Part C (10 free)   |  1 | <-- newly appended 

Таблица Пояснение:

id является unique номер и автоматически генерируется с помощью таблицы. Quantity - количество запасных частей. id#1 и id#95 - это одна и та же часть, но id#95 - это обновленная информация - т.е. предназначалась для замены/обновления id#1. Там никогда не должно быть строки «(0 free)» в конце части - и, следовательно, ее нужно удалить. Это также тот же случай для id#2 и id#96. id#97 - это новая деталь, и мне просто нужно избавиться от строки «(10 free)» в конце. id#3 и id#4 - это старые части, которые не были обновлены и, следовательно, должны быть оставлены такими, какие они есть.

Вопрос: новые части, которые я прилагаемая в основном (не все) имеют «([some number] free)» строка добавляется к концу Part. Иногда эти части уникальны (т. Е. Не имеют дубликатов). Вопрос: Как мне избавиться от дубликатов, но убедитесь, что информация обновлена. Вопрос: Может ли это быть сделано с кодом MySQL? Если не так, как бы я сделал это с помощью bash !?

Идеальный выход:

+-----+---------------------------+----------+ 
| id |  Part Name  | Quantity | 
+-----+---------------------------+----------+ 
| 1 | Part A (1/4")    |  4 | <-- Updated 
| 2 | Part B     |  5 | <-- Updated 
| 3 | Part D     |  4 | 
| 4 | Part E     |  9 | 
| ... | a lot of part names later | ... | 
| 95 | Part C     |  1 | <-- newly appended 

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

ответ

0

Это немного боль в MySQL. Стандартный SQL будет использовать exists:

delete t 
    from t 
    where partname like '%(% free)' and 
      not exists (select 1 from t t2 where t2.name like concat(t.name, '(% free)')); 

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

update t join 
     t tfirst 
     on tfirst.id < t.id and 
      substring_index(t.partname, ' (', 1) = tfirst.partname and 
      t.partname like '% (% free)' 
    set tfirst.quantity = tfirst.quantity + t.quantity; 

Обратите внимание, что эта формулировка работает только для одного дубликата. Если их больше одного, то для обновления будет выбрано произвольное.

Затем вы можете удалить дубликаты:

delete t 
    from t join 
     t tfirst 
     on tfirst.id < t.id and 
      substring_index(t.partname, ' (', 1) = tfirst.partname and 
      t.partname like '% (% free)'; 

Затем вы хотите обновить partnames, которые остальные "с" запись:

update t 
    set partname = substring_index(t.partname, ' (', 1) 
    where t.partname like '% (% free)'; 
Смежные вопросы