sql >> Databasteknik >  >> RDS >> Mysql

MYSQL Deduplicera och ta bort dubblettraden med minst data

Du kan använda denna DELETE-fråga, som är generisk och lätt kan anpassas för att stödja fler fält:

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 fiolen här .

Den här frågan returnerar det maximala antalet icke-nullfält, för varje e-postmeddelande:

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

Jag går sedan med i den här frågan med tabellnamn för att få det lägsta ID för varje e-postmeddelande som har det maximala antalet icke-nullfält:

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

och sedan tar jag bort alla rader som har ett ID som inte returneras av den här frågan.



  1. Bästa sättet att läsa CSV i Ruby. Snabbare CSV?

  2. Förstå Always ON Availability Group mellan Linux-baserade SQL Server-instanser. Del 1

  3. Är det möjligt att skapa en kolumn med UNIX_TIMESTAMP standard i MySQL?

  4. Finns det något sätt att få radnumret i Mysql som rownumret i oracle