sql >> データベース >  >> RDS >> Mysql

MYSQL重複排除し、データが最も少ない重複行を削除します

    このDELETEクエリを使用できます。これは一般的であり、より多くのフィールドをサポートするように簡単に適合させることができます。

    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
    

    フィドルこちら をご覧ください。 。

    このクエリは、すべての電子メールについて、null以外のフィールドの最大数を返します:

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

    次に、このクエリをtablenameと結合して、null以外のフィールドの最大数を持つすべての電子メールの最小IDを取得します。

    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
    

    次に、このクエリで返されないIDを持つすべての行を削除します。



    1. WHERE句を使用するとMySQLのLEFTJOINがNULLレコードを返すのはなぜですか?

    2. mysqlからPDOへの移行

    3. Jenkins Script Console/ScriptlerのConnector/JMySQLドライバー

    4. データベース(モデル)をクエリするためのDjangoフォーム