УДАЛИТЬ дубликаты из таблицы, где есть две переменные для рассмотрения - PullRequest
1 голос
/ 02 ноября 2010

У нас есть таблица с идентификатором (автоинкремент), ClassID, StudentID. Идентификатор класса предназначен для класса, который посещает студент. Иногда наша система создает дубликаты одного и того же ученика в одном классе. В настоящее время мы пытаемся решить эту проблему. Это может быть связано с нажатием кнопки назад.

Ученики часто посещают следующий урок, поэтому мы не хотим удалять дубликаты учеников. Мы хотим удалить дубликаты учеников, которые содержатся в одном и том же classID.
Например:

ID | ClassID | StudentID
1  |   1     |     1
2  |   2     |     1
3  |   2     |     1
4  |   2     |     2
5  |   2     |     2

Я хочу удалить идентификаторы 3 и 5. Я искал в Интернете этот ответ и не могу его найти. Лучшее, что я нашел, это группировка, но как мне сгруппировать каждый идентификатор класса и найти дубликаты в каждой группе classID?

Ответы [ 5 ]

3 голосов
/ 03 ноября 2010

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

SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID;

В этом случае DISTINCT будет лучшим решением. Однако иногда лучше начать с плохого синтаксиса, такого как приведенный выше, чтобы сделать хороший запрос. Сначала давайте выберем дубликаты пар:

SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID
HAVING COUNT(*) > 1;

Как вы можете знать или не знать, вы не можете удалять строки, используя подзапрос в запросе DELETE. Вы должны использовать временную таблицу. Полный код для этого:

CREATE TEMPORARY TABLE keep_lines AS 
    SELECT MAX(id) AS id_to_keep -- you can use MIN if wanted
    FROM your_table
    GROUP BY ClassID, StudentID;

DELETE FROM your_table
WHERE id NOT IN (SELECT id_to_keep
                 FROM keep_lines);

DROP TABLE keep_lines;

Затем, как говорили многие другие, добавьте в свою таблицу УНИКАЛЬНОЕ ограничение!

2 голосов
/ 03 ноября 2010

Вы не можете DELETE или UPDATE записей той же таблицы, которую вы используете для ссылки. Таким образом, вам нужно будет либо создать временную таблицу для использования в качестве ссылки. Или создайте PHP-скрипт, который будет запускать команду DELETE из ваших соответствующих идентификаторов.

Вот пример SQL-запроса:

SELECT MIN(ID) AS minID, ClassID, StudentID
FROM the_table GROUP BY ClassID, StudentID HAVING COUNT(StudentID) > 1

Вы можете запустить это несколько раз, и он будет продолжать удалять дубликаты.

0 голосов
/ 03 ноября 2010

Я бы настоятельно предложил решение с использованием временной таблицы. Легко, быстро и без сложностей. Просто создайте аналогичную таблицу (возможно, type = MEMORY для скорости), затем вставьте все строки, используя простой запрос выбора, обрежьте исходную таблицу и замените данные таблицы данными из временной таблицы.

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

0 голосов
/ 03 ноября 2010

Вы можете найти другое приложение здесь .Но ограничение уникального ключа для ClassID и StudentID - это то, что вам обязательно нужно сделать.

0 голосов
/ 03 ноября 2010

Вы можете использовать следующие операторы SQL, чтобы удалить все, кроме самых ранних уникальных строк:

create temporary table unique_ids as
select min(id) as ID
  from some_table
 group by ClassID, StudentID;

delete some_table
  from some_table
       left join unique_ids using (id)
 where unique_ids.id is null;

Если вы работаете с большой таблицей, рассмотрите возможность добавления индекса после создания временной таблицы.

...