sql >> Databasteknik >  >> RDS >> Mysql

Hur ändrar man dubbletter av rader till unika värden i mysql?

det här är lite knepigt.. Jag testade på min lokala värd och den gör vad du vill.. låt mig veta om du har några frågor. 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

Slutresultatet ser ut så här:BILD

EDIT: Detta kan fungera bättre för prestanda skull

1. KÖR FÖRST DEN HÄR FÖRFRÅGAN

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. KÖR DÅ DENNA UPPDATERING

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

Jag testade detta på min lokala och det fungerar så du borde kunna få det här att köra :)



  1. Få sista posten för varje månad i MySQL....?

  2. Mysqli tillåter inte flera frågor?

  3. Hur man ändrar sekunder till ett tidsvärde i MySQL

  4. Accenttecken i mySQL-tabellen