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

Премахване на дублиращи се редове, оставяйки само най-стария ред?

Тъй като използвате колоната id като индикатор за това кой запис е „оригинален“:

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

Това ще остави по един запис на имейл адрес.

редактиране за добавяне:

За да обясните заявката по-горе...

Идеята тук е да се присъедини към масата срещу себе си. Преструвайте се, че имате две копия на таблицата, всяко от които има различно име. След това можете да ги сравните един с друг и да намерите най-ниския идентификатор или за всеки имейл адрес. След това ще видите дублиращите се записи, които са създадени по-късно, и бихте могли да ги изтриете. (Визуализирах Excel, когато мислех за това.)

За да извършите тази операция върху таблица, да я сравните със себе си и да можете да идентифицирате всяка страна, използвате псевдоними на таблица. x е псевдоним на таблица. Присвоява се в от клауза така:от

<псевдоним> . x вече може да се използва другаде в същата заявка, за да се позовава на тази таблица като пряк път.

изтрийте x стартира заявката с нашето действие и цел. Ще извършим заявка за избор на записи от множество таблици и искаме да изтрием записи, които се появяват в x .

Псевдонимите се използват за обозначаване на двата „екземпляра“ на таблицата. от myTable x присъединете се към myTable z на x.subscriberEmail =z.subscriberEmail блъска масата срещу себе си, където имейлите съвпадат. Без клаузата where, която следва, всеки запис ще бъде избран, тъй като може да бъде съединен срещу себе си.

къде клаузата ограничава записите, които са избрани. където x.id> z.id позволява псевдонима „екземпляр“ x да съдържа само записите, които съвпадат с имейли, но имат по-висок id стойност. Данните, които наистина искате в таблицата, уникални имейл адреси (с най-нисък идентификатор) няма да бъдат част от x и няма да бъдат изтрити. Единствените записи в x ще бъдат дублирани записи (имейл адреси), които имат по-висок id отколкото оригиналния запис за този имейл адрес.

Клаузите за присъединяване и where могат да бъдат комбинирани в този случай:

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

За да предотвратите дублиране, помислете за превръщането на колоната subscriberEmail в УНИКАЛНА индексирана колона.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да проверите версията на MySQL

  2. JSON_VALUE() в MySQL

  3. Кой е най-добрият начин за синхронизиране на данни между MS Access и MySQL?

  4. MySQL:Групиране по и преброяване на множество полета

  5. Как да показвам записи вертикално в командния ред на mysql?