Mysql
 sql >> база данни >  >> RDS >> Mysql

Изтрийте дубликати въз основа на две колони и запазете реда, който има минимална стойност на друга колона

Можете да използвате тази заявка, за да изтриете всички дублиращи се записи, като оставите най-ранния:

DELETE d
FROM discog d
JOIN discog d1 ON d1.artist = d.artist AND d1.track = d.track AND d1.year < d.year;

Актуализация

Алтернативно решение, което трябва да е по-ефективно за наистина големи таблици, е да се създаде копие, като се използва УНИКАЛЕН индекс на редовете, за да се предотврати дублиране на вмъкване:

CREATE TABLE discog_copy (id INT, artist VARCHAR(50), track VARCHAR(50), year INT);
ALTER TABLE discog_copy ADD UNIQUE KEY (artist, track);
INSERT IGNORE INTO discog_copy SELECT * FROM discog ORDER BY year;

Уникалният ключ е на комбинацията на име на изпълнител и име на песен и така ще позволи на изпълнителите да имат различни песни и различните изпълнители да имат едно и също име на песен. Тъй като SELECT част от заявката има ORDER BY година, първо ще вмъкне комбинацията (изпълнител, песен, година) с най-ниската година и след това други идентични записи (изпълнител, песен) няма да бъдат вмъкнати поради дублиращия се ключ.

Демо на rextester




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. joomla 1.5.22 на mysql 5.5

  2. Използвайте директивата IN, за да търсите с подготвен оператор

  3. Стойност по подразбиране на ниво Django DB за колона

  4. Най-добра практика за съхраняване на етикети в база данни?

  5. Как да преодолеем java.sql.SQLException:Изключение за твърде много връзки?