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

MYSQL Deduplikuj i usuń zduplikowany wiersz z najmniejszą ilością danych

Możesz użyć tego zapytania DELETE, które jest ogólne i można je łatwo dostosować do obsługi większej liczby pól:

DELETE tablename.*
FROM
  tablename LEFT JOIN (
    SELECT MIN(id) min_id
    FROM
      tablename t INNER JOIN (
        SELECT
          emails, MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
        FROM
          tablename
        GROUP BY
          emails) m
      ON t.emails=m.emails
         AND ((t.name IS NOT NULL) + (t.surname IS NOT NULL))=m.max_non_nulls
    GROUP BY
      t.emails) ids
  ON tablename.id=ids.min_id
WHERE
  ids.min_id IS NULL

Zobacz skrzypce tutaj .

To zapytanie zwraca maksymalną liczbę pól innych niż null dla każdego e-maila:

SELECT
  emails,
  MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
  tablename
GROUP BY
  emails

Następnie łączę to zapytanie z nazwą tabeli, aby uzyskać minimalny identyfikator dla każdego e-maila, który ma maksymalną liczbę pól innych niż null:

SELECT MIN(id) min_id
FROM
  tablename t INNER JOIN (
    SELECT
      emails, MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
    FROM
      tablename
    GROUP BY
      emails) m
  ON t.emails=m.emails
     AND ((t.name IS NOT NULL) + (t.surname IS NOT NULL))=m.max_non_nulls
GROUP BY
  t.emails

a następnie usuwam wszystkie wiersze, które mają identyfikator, który nie jest zwracany przez to zapytanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baza danych do wyszukiwania pełnotekstowego i ponad 200 mln rekordów

  2. Wersja php-mysql powoduje konflikt z serwerem Mysql

  3. SQL SELECT z relacją m:n

  4. Jak skutecznie połączyć się z mysql w php bez ponownego łączenia się przy każdym zapytaniu?

  5. Uzyskiwanie zmodyfikowanych danych przechodzenia z drzewa zamówień w przedsprzedaży do tablicy