sql >> Databasteknik >  >> RDS >> Mysql

Ta bort dubbletter av rader och lämna endast den äldsta raden?

Eftersom du använder id-kolumnen som en indikator på vilken post som är "original":

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

Detta lämnar en post per e-postadress.

redigera för att lägga till:

För att förklara frågan ovan...

Tanken här är att gå med i bordet mot sig själv. Låtsas att du har två kopior av tabellen, som var och en heter något annat. Sedan kan du jämföra dem med varandra och hitta det lägsta ID eller för varje e-postadress. Du skulle då se dubblettposterna som skapades senare och kan radera dem. (Jag visualiserade Excel när jag tänkte på detta.)

För att göra den operationen på en tabell, jämföra den med sig själv och kunna identifiera varje sida, använder du tabellalias. x är ett tabellalias. Den tilldelas i från sats som så:från

. x kan nu användas någon annanstans i samma fråga för att referera till den tabellen som en genväg.

ta bort x startar frågan med vår åtgärd och vårt mål. Vi kommer att utföra en fråga för att välja poster från flera tabeller, och vi vill ta bort poster som visas i x .

Alias ​​används för att referera till båda 'instanserna' i tabellen. från myTable x gå med i myTable z på x.subscriberEmail =z.subscriberEmail stöter bordet mot sig själv där mejlen matchar. Utan where-klausulen som följer skulle varje post väljas ut eftersom den skulle kunna slås samman mot sig själv.

var klausul begränsar de poster som väljs. där x.id> z.id tillåter "instansen" alias x att endast innehålla de poster som matchar e-postmeddelanden men som har ett högre id värde. Den data som du verkligen vill ha i tabellen, unika e-postadresser (med lägsta id) kommer inte att vara en del av x och kommer inte att raderas. De enda posterna i x kommer att vara dubbla poster (e-postadresser) som har ett högre id än den ursprungliga posten för den e-postadressen.

Klausulerna join och where skulle kunna kombineras i detta fall:

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

För att förhindra dubbletter, överväg att göra prenumerantEmail-kolumnen till en UNIK indexerad kolumn.



  1. Använder exklusiv eller i mysql

  2. SQL räknar alla rader istället för att räkna enskilda rader

  3. Varför returnerar detta resurs-id #2?

  4. PostgreSQL nästa värde för sekvenserna?