sql >> Database teknologi >  >> RDS >> Mysql

MYSQL Dedupliker og fjern den dubletrække med mindst data

Du kan bruge denne DELETE-forespørgsel, som er generisk og let kan tilpasses til at understøtte flere felter:

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

Se venligst violin her .

Denne forespørgsel returnerer det maksimale antal felter, der ikke er nul, for hver e-mail:

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

Jeg slutter mig derefter til denne forespørgsel med tabelnavn for at få minimums-id'et for hver e-mail, der har det maksimale antal felter, der ikke er 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

og så sletter jeg alle rækker, der har et ID, der ikke returneres af denne forespørgsel.



  1. Php kalder sqlserver backup database script, backup fil oprettet og derefter slettet

  2. Automatiser Database Schema Object Check

  3. Sådan gemmer du fremtidige(!) datoer i en database

  4. Sådan optimerer du MySQL/MariaDB-tabeller