Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Xóa các bản sao dựa trên hai cột và giữ hàng có giá trị nhỏ nhất của một cột khác

Bạn có thể sử dụng truy vấn này để xóa tất cả các mục nhập trùng lặp, để lại mục nhập sớm nhất:

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

Cập nhật

Một giải pháp thay thế sẽ hiệu quả hơn cho các bảng thực sự lớn là tạo một bản sao, sử dụng chỉ mục DUY NHẤT trên các hàng để ngăn chèn trùng lặp:

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;

Khóa duy nhất nằm trên sự kết hợp tên nghệ sĩ và tên bài hát và vì vậy nó sẽ cho phép các nghệ sĩ có các bản nhạc khác nhau và các nghệ sĩ khác nhau có cùng tên bản nhạc. Bởi vì SELECT một phần của truy vấn có ORDER BY năm, nó sẽ chèn kết hợp (nghệ sĩ, ca khúc, năm) với năm thấp nhất đầu tiên và sau đó các bản ghi (nghệ sĩ, ca khúc) giống hệt nhau khác sẽ không được chèn do khóa trùng lặp.

Demo trên 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. Mã hóa DB hai cách bảo mật ngay cả từ Quản trị viên

  2. Mã lỗi 1005, trạng thái SQL HY000:Không thể tạo bảng errno:150

  3. Ví dụ về vòng lặp trong MySQL

  4. Cài đặt Lower_case_table_names trong MySQL 8.0.12

  5. Cách sắp xếp các kết quả VARCHAR của MySQL