2014-10-10 2 views
1

У меня есть дубликат запроса искателя ...Преобразовать Duplicate Finder запросов на Отбросьте все Но последние записи

SELECT 
    Author, Name, TrackNum, title_id, COUNT(*) 
FROM 
    db.table 
GROUP BY 
    Author, Name, TrackNum, title_id 
HAVING 
    COUNT(*) > 1 

возвращает те записи, которые являются дубликатами, и подсчет того, сколько есть.

Я хотел бы расширить это, чтобы оно уменьшало все, кроме последней версии каждого дубликата (ов). Я думаю, мы могли бы использовать поле id или datetime, которое у меня есть в таблице, чтобы определить, какие записи хранить. Или есть другой способ?

Edit: Я на полпути ...

SELECT 
    * 
FROM 
    db.table 
GROUP BY 
    Author, Name, TrackNum, title_id 
HAVING 
    COUNT(*) > 1 
ORDER BY 
    Name, TrackNum 

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

ответ

1

Предложенное решение

# 
# Step 01) Create Temp Key Tables 
# 
CREATE TABLE KeysToKeep 
(
    id INT NOT NULL, 
    PRIMARY KEY (id) 
); 
CREATE TABLE KeysToDrop LIKE KeysToKeep; 
# 
# Step 02) Collect All id values you want to Keep 
# 
INSERT INTO KeysToKeep 
    SELECT id FROM 
    (SELECT MAX(id) id,Author, Name, TrackNum, title_id 
    FROM db.table GROUP BY Author, Name, TrackNum, title_id) A 
; 
# 
# Step 03) Collect All id values you want to Drop 
# 
INSERT INTO KeysToDrop 
SELECT A.id FROM db.table A LEFT JOIN KeysToKeep USING (id) WHERE B.id IS NULL; 
# 
# Step 04) Do the Mass Delete 
# 
DELETE A.* FROM db.table A INNER JOIN KeysToDrop B USING (id); 
# 
# Step 05) Remove Temp Key Tables 
# 
DROP TABLE KeysToKeep; 
DROP TABLE KeysToDrop; 

Предложенное решение (укороченная версия)

# 
# Step 01) Create Temp Key Table 
# 
CREATE TABLE KeysToKeep 
(
    id INT NOT NULL, 
    PRIMARY KEY (id) 
); 
# 
# Step 02) Collect All id values you want to Keep 
# 
INSERT INTO KeysToKeep 
    SELECT id FROM 
    (SELECT MAX(id) id,Author, Name, TrackNum, title_id 
    FROM db.table GROUP BY Author, Name, TrackNum, title_id) A 
; 
# 
# Step 03) Do the Mass Delete 
# 
DELETE A.* FROM db.table A LEFT JOIN KeysToKeep B USING (id) WHERE B.id IS NULL; 
# 
# Step 04) Remove Temp Key Table 
# 
DROP TABLE KeysToKeep; 

Предложенное решение (Paranoid Version)

# 
# Step 01) Create Temp Key Table 
# 
CREATE TABLE KeysToKeep 
(
    id INT NOT NULL, 
    PRIMARY KEY (id) 
); 
# 
# Step 02) Collect All id values you want to Keep 
# 
INSERT INTO KeysToKeep 
    SELECT id FROM 
    (SELECT MAX(id) id,Author, Name, TrackNum, title_id 
    FROM db.table GROUP BY Author, Name, TrackNum, title_id) A 
; 
# 
# Step 03) Copy the Tables to Keep to Another Temp Table 
# 
CREATE TABLE db.table_new LIKE db.table; 
INSERT INTO db.table_new 
SELECT A.* FROM db.table A INNER JOIN KeysToKeep B USING (id); 
# 
# Step 04) Swap New and Old Tables 
# 
ALTER TABLE db.table RENAME db.table_old; 
ALTER TABLE db.table_new RENAME db.table; 
# 
# Step 05) Remove Temp Key Table 
# 
DROP TABLE KeysToKeep; 
# 
# Step 06) Drop the Old Table If the Content of db.table is Correct 
# 
DROP TABLE db.table_old; 

Эпилог

В первых двух случая s, отметьте KeysToKeep и/или KeysToDrop, чтобы убедиться, что они являются ключами для сохранения или удаления. В последнем случае, если вы уверены, оставьте таблицу db.table_old. Если вы не уверены, вы можете откинуть его назад следующим образом:

ALTER TABLE db.table RENAME db.table_new; 
ALTER TABLE db.table_old RENAME db.table; 

ДАЙТЕ ЭТО ПОВРЕЖДЕНИЕ!

+0

Спасибо за замечательный ответ. Я просто работаю над этим сейчас в тестовой среде. Я попробовал параноидальную версию. Сначала я заменил все вхождения db своим именем db. Я получил синтаксическую ошибку, поэтому удалил лишний ';'. Затем я получил сообщение об ошибке «Код ошибки: 1248. Каждая производная таблица должна иметь свой собственный псевдоним». Есть идеи? –

+0

Я забыл поместить псевдоним в Шаг 02. Попробуйте еще раз ... – RolandoMySQLDBA

+0

OK пробовал, что теперь я получаю эту ошибку ... 'У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'INSERT INTO KeysToKeep SELECT id FROM (SELECT MAX (id) id, Author, Name, T' в строке 12' Примечание. Я удалил лишнюю точку с запятой о котором я упомянул ранее (строка 7). –

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