sql >> Databáze >  >> RDS >> Mysql

MYSQL Deduplikujte a odstraňte duplicitní řádek s nejmenším počtem dat

Můžete použít tento dotaz DELETE, který je obecný a lze jej snadno upravit tak, aby podporoval více polí:

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

Viz housle zde .

Tento dotaz vrací maximální počet nenulových polí pro každý e-mail:

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

Pak se připojuji k tomuto dotazu s názvem tabulky, abych získal minimální ID pro každý e-mail, který má maximální počet nenulových polí:

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 poté smažu všechny řádky, které mají ID, které tento dotaz nevrací.



  1. Vložení do tabulky mysql a přepsání aktuálních dat

  2. Vložte pole záznamů do mysql pomocí Node JS

  3. Propojte MySQL s Pythonem 3.6

  4. Python MySql Insert nefunguje