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

重複する行をmysqlで一意の値に変更するにはどうすればよいですか?

    これは少し注意が必要です。ローカルホストでテストしましたが、必要な処理が実行されます。ご不明な点がありましたらお知らせください。 SQL FIDDLE

    UPDATE temp t1, 
    (
        SELECT 
            id as unique_id, 
            new_name 
        FROM(
            SELECT
              id,
              IF(@ROW = Name, @COUNT, @COUNT := 1),
              CONCAT(Name, ' - ', @COUNT) AS new_name,
              @ROW := Name,
              @COUNT := @COUNT + 1
            FROM temp
            JOIN (SELECT @COUNT := 0, @ROW := "") AS t
            WHERE Name IN(SELECT Name FROM temp
            GROUP BY Name
            HAVING COUNT(Name) > 1)
        ) AS temp_test
    ) as testing
    SET t1.Name = testing.new_name where t1.id = testing.unique_id
    

    最終的な出力は次のようになります: PICTURE

    編集: これはパフォーマンスのためにうまくいくかもしれません

    1。 このクエリを最初に実行する

    SET SESSION group_concat_max_len = 1000000;  -- longer if needed
    SET @query1 := (
    SELECT 
        GROUP_CONCAT(DISTINCT unique_name) 
    FROM temp
    JOIN(
        select Name as unique_name
        FROM temp
        GROUP BY name
        HAVING COUNT(Name) > 1
    ) as t
    );
    

    2。 次に、この更新を実行します

    UPDATE temp t1, 
    (
        SELECT 
            id as unique_id, 
            new_name 
        FROM(
            SELECT
              id,
              IF(@ROW = Name, @COUNT, @COUNT := 1),
              CONCAT(Name, ' - ', @COUNT) AS new_name,
              @ROW := Name,
              @COUNT := @COUNT + 1
            FROM temp
            JOIN (SELECT @COUNT := 0, @ROW := "") AS t
            WHERE FIND_IN_SET (`name`, @query1)
        ) AS temp_test
    ) as testing
    SET t1.Name = testing.new_name where t1.id = testing.unique_id
    

    私はこれをローカルでテストしましたが、動作するので、これを実行できるはずです:)



    1. SQLコマンド

    2. MySQLコピーデータベース

    3. Pythonで(utf8mb4)をエンコードする方法

    4. SQL_CALC_FOUND_ROWS / FOUND_ROWS()はPHPでは機能しません