2015-07-23 3 views
0

У меня есть таблица под названием sg со следующими столбцами:
player_uuid, player_name, coins, kills, deaths и winsУдаление дубликатов строк MySQL на основе данных столбцов

Однако, я столкнулся с проблемой, что вызвало некоторые повторяющиеся строки и некоторые из этих строк были изменены. Итак, мне интересно, как удалить строки со старыми данными. Тем не менее ...

Как сбросить дубликаты строк, где player_uuid - это то же самое? Но я хочу только сбросить строки, где coins, kills, deaths, или wins меньше, чем в двух экземплярах.

Данные примера: http://i.stack.imgur.com/Xieod.png
В этом случае я хочу сохранить строку с 46 смертями и удалить строку с 43 смертельными случаями.

+0

Как вы определяете старые данные? Только меньше убивает? Что делать, если победы разные (и т. Д.)? –

+0

@NorbertvanNobelen Старшая строка была бы, если бы монеты, убийства, смертельные случаи или победы были меньше, чем другие. – huhn

+0

равный не происходит наверняка? –

ответ

0

Неспособность придумать с одним ВЕЬЕТЕ из-за пути структурирован данные: 3 ВЕЬЕТЕ вместо:

Путь это работает: Найти, если есть несколько строк для данного UUID, и определяются какую строку нужно сохранить (максимальное значение данного столбца), затем присоединиться к себе и определить, какие строки не должны храниться, хранить во временной таблице и удалять все, что помечено в этой временной таблице из таблицы основных данных (называемый someTable). Преимущество такого подхода: если у вас более 1 дубликата (3,4,5 строки до бесконечности), они также будут удалены.

CREATE TEMPORARY TABLE tempTable AS 
SELECT a.player_uuid, a.kills, b.keepRow 
FROM someTable a 
LEFT JOIN (SELECT MAX(kills) AS kills, player_uuid, 1 AS keepRow 
    FROM sometable 
    GROUP BY player_uuid 
    HAVING COUNT(*)>1 
) b ON a.player_uuid=b.player_uuid AND a.kills=b.kills 
WHERE b.keepRow!=1; 

DELETE a.* FROM someTable a, tempTable b 
    WHERE a.player_uuid=b.player_uuid AND a.kills=b.kills; 

Повторите для других столбцов (wins, coins, deaths) путем замены всех kills с другими именами столбцов.

Всегда тест удалять код первого :)

также: В то время как вы на него:

В уникальный индекс, чтобы предотвратить это повторилось:

CREATE UNIQUE INDEX idx_st_nn_1 ON someTable(player_uuid); 

Когда вы потом попробуйте вставить неисправную запись, ваш код просто получит ошибку в ответ. Лучший код для обработки вставок в этом случае будет:

INSERT INTO someTable(player_uuid,kills) VALUES ('someplayer',1000) 
    ON DUPLICATE KEY UPDATE kills=1000; 

Что помогает также оказывают некоторое время колонки индикатора: Тогда только один удаление должны быть выполнено:

ALTER TABLE someTable ADD COLUMN (last_updated TIMESTAMP); 

Timestamps обновлять их сами , поэтому никаких изменений кода не требуется для использования.

Смежные вопросы