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

Loại bỏ các hàng trùng lặp Chỉ để lại hàng cũ nhất?

Vì bạn đang sử dụng cột id làm chỉ báo bản ghi nào là 'bản gốc':

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Điều này sẽ để lại một bản ghi cho mỗi địa chỉ email.

chỉnh sửa để thêm:

Để giải thích truy vấn trên ...

Ý tưởng ở đây là tham gia vào bảng chống lại chính nó. Giả sử bạn có hai bản sao của bảng, mỗi bản có tên khác nhau. Sau đó, bạn có thể so sánh chúng với nhau và tìm id thấp nhất hoặc cho từng địa chỉ email. Sau đó, bạn sẽ thấy các bản ghi trùng lặp được tạo sau này và có thể xóa chúng. (Tôi đang hình dung về Excel khi nghĩ về điều này.)

Để thực hiện thao tác đó trên bảng, so sánh nó với chính nó và có thể xác định từng bên, bạn sử dụng bí danh bảng. x là một bí danh bảng. Nó được gán trong from mệnh đề như vậy:from <table> <alias> . x bây giờ có thể được sử dụng ở nơi khác trong cùng một truy vấn để tham chiếu đến bảng đó như một lối tắt.

delete x bắt đầu truy vấn với hành động và mục tiêu của chúng tôi. Chúng tôi sẽ thực hiện một truy vấn để chọn các bản ghi từ nhiều bảng và chúng tôi muốn xóa các bản ghi xuất hiện trong x .

Bí danh được sử dụng để chỉ cả hai 'phiên bản' của bảng. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail nâng bàn lên so với chính nó nơi các email khớp với nhau. Nếu không có mệnh đề where theo sau, mọi bản ghi sẽ được chọn vì nó có thể được nối với chính nó.

where mệnh đề giới hạn các bản ghi được chọn. where x.id > z.id cho phép bí danh 'phiên bản' x để chỉ chứa các bản ghi khớp với email nhưng có id cao hơn giá trị. Dữ liệu mà bạn thực sự muốn có trong bảng, các địa chỉ email duy nhất (với id thấp nhất) sẽ không thuộc x và sẽ không bị xóa. Các bản ghi duy nhất trong x sẽ là các bản ghi trùng lặp (địa chỉ email) có id cao hơn so với bản ghi ban đầu cho địa chỉ email đó.

Các mệnh đề liên kết và where có thể được kết hợp trong trường hợp này:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Để ngăn chặn các bản sao, hãy cân nhắc đặt cột email của người đăng ký trở thành cột được lập chỉ mục DUY NHẤT.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dịch vụ MySQL57 trên Máy tính cục bộ bắt đầu và sau đó dừng lại

  2. Một cái nhìn chuyên sâu về Lập chỉ mục cơ sở dữ liệu

  3. tại sao tôi gặp lỗi cú pháp cho câu lệnh đã chuẩn bị?

  4. Cách tìm nạp các giá trị thả xuống từ cơ sở dữ liệu và hiển thị trong jsp

  5. RegEx với preg_match để tìm và thay thế một chuỗi SIMILAR