Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Usunąć zduplikowane wiersze, pozostawiając najstarszy wiersz Tylko?

Ponieważ używasz kolumny id jako wskaźnika, który rekord jest „oryginalny”:

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

To pozostawi jeden rekord na adres e-mail.

edytuj, aby dodać:

Aby wyjaśnić powyższe zapytanie...

Chodzi o to, aby dołączyć do stołu przeciwko sobie. Udawaj, że masz dwie kopie tabeli, z których każda ma inną nazwę. Następnie możesz porównać je ze sobą i znaleźć najniższy identyfikator lub dla każdego adresu e-mail. Zobaczysz wtedy zduplikowane rekordy, które zostały utworzone później i możesz je usunąć. (Myśląc o tym, wizualizowałem Excela.)

Aby wykonać tę operację na tabeli, porównać ją ze sobą i móc zidentyfikować każdą ze stron, użyj aliasów tabel. x to alias tabeli. Jest przypisany w from klauzula w następujący sposób:from <table> <alias> . x może być teraz używany w innym miejscu tego samego zapytania, aby odwoływać się do tej tabeli jako skrótu.

delete x rozpoczyna zapytanie od naszego działania i celu. Zamierzamy wykonać zapytanie, aby wybrać rekordy z wielu tabel i chcemy usunąć rekordy, które pojawiają się w x .

Aliasy są używane w odniesieniu do obu „instancji” tabeli. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail uderza tabelę o siebie w miejscu, w którym pasują e-maile. Bez klauzuli WHERE, która następuje, każdy rekord zostałby wybrany, ponieważ mógłby zostać połączony ze sobą.

where klauzula ogranicza wybrane rekordy. where x.id > z.id zezwala na 'instancję' z aliasem x zawierać tylko te rekordy, które pasują do e-maili, ale mają wyższy id wartość. Dane, które naprawdę chcesz w tabeli, unikalne adresy e-mail (o najniższym identyfikatorze) nie będą częścią x i nie zostaną usunięte. Jedyne rekordy w x będą zduplikowanymi rekordami (adresami e-mail), które mają wyższy id niż oryginalny rekord dla tego adresu e-mail.

W takim przypadku klauzule join i where mogą być łączone:

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

Aby zapobiec duplikatom, rozważ ustawienie kolumny SubscribeEmail jako kolumny indeksowanej UNIKALNIE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Procedura składowana MySQL a funkcja, której powinienem użyć, kiedy?

  2. Odmowa dostępu dla użytkownika „[chroniony adres e-mail]” (przy użyciu hasła:NIE)

  3. Wyświetlanie danych mysql w tabeli html PHP

  4. Używanie strtotime dla dat sprzed 1970

  5. Uruchamianie migracji z Railsami w kontenerze Docker z wieloma instancjami kontenera