Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie ändere ich doppelte Zeilen in eindeutige Werte in mysql?

Das ist ein wenig knifflig. Ich habe es auf meinem lokalen Host getestet und es tut, was Sie wollen. Lassen Sie es mich wissen, wenn Sie Fragen haben. 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

Die endgültige Ausgabe sieht so aus:PICTURE

BEARBEITEN: Dies kann aus Leistungsgründen besser funktionieren

1. FÜHREN SIE ZUERST DIESE ABFRAGE AUS

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. FÜHREN SIE DANN DIESES UPDATE AUS

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

Ich habe dies auf meinem lokalen Gerät getestet und es funktioniert, also sollten Sie in der Lage sein, es zum Laufen zu bringen :)