Неспособность придумать с одним ВЕЬЕТЕ из-за пути структурирован данные: 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 обновлять их сами , поэтому никаких изменений кода не требуется для использования.
Как вы определяете старые данные? Только меньше убивает? Что делать, если победы разные (и т. Д.)? –
@NorbertvanNobelen Старшая строка была бы, если бы монеты, убийства, смертельные случаи или победы были меньше, чем другие. – huhn
равный не происходит наверняка? –