Убрать повторы mysql php
MYSQL. Удалить дубли строк?
Есть таблика с 100.000 строк.
Нужно удалить дубли строк(именно строк а не ячеек)
то есть чтобы от таблицы:
Одну строчку (1 0) нужно удалить так как из было 2.
Можно ли это сделать запросом или без php не обойтись?
CREATE TEMPORARY TABLE tmp_tab AS SELECT DISTINCT * FROM your_table;
DELETE FROM your_table;
INSERT INTO your_table SELECT * FROM tmp_tab;
DROP TABLE tmp_tab;
Добавьте первичный ключ (id) а потом:
DELETE FROM table as me, table as clone WHERE me.c1 = clone.c1 AND me.c2 = clone.c2 AND me.id более трёх лет назад
Мне нравится такой способ:
Создаем таблицу dst с той же структурой, но добавляем цифровое поле DupCount
делаем запрос:
INSERT INTO dst SELECT * FROM src ON DUPLICATE KEY UPDATE dst.DupCount = dst.DupCount +1
DupCount для каждой строки будет содержать число встретившихся повторов.
Можно написать скрипт, который будет создавать таблицу dst, копировать таким образом туда данные, удалять исходную таблицу и переименовывать dst в src.
Удалить повторяющиеся строки в MySQL
у меня есть таблица со следующими полями:
после выполнения этого запроса я могу удалить дубликаты с помощью сценария на стороне сервера.
но я хочу знать, можно ли это сделать только с помощью SQL-запроса.
17 ответов
очень простой способ сделать это, чтобы добавить UNIQUE индекс по 3 столбцам. Когда вы пишете ALTER заявление, включают IGNORE ключевое слово. Вот так:
это приведет к удалению всех повторяющихся строк. В качестве дополнительного преимущества, будущее INSERTs повторяющиеся ошибок. Как всегда, вы можете сделать резервную копию перед запуском чего-то подобного.
Если вы не хотите изменять свойства столбца, вы можете использовать запрос ниже.
поскольку у вас есть столбец с уникальными идентификаторами (например, auto_increment столбцы), вы можете использовать его для удаления дубликатов:
в MySQL, вы можете упростить его еще больше NULL-безопасный равный оператор (он же «оператор корабля»):
MySQL имеет ограничения относительно ссылки на таблицу, из которой вы удаляете. Вы можете обойти это с помощью временной таблицы, как:
из предложения Костаноса в комментариях:
Единственный медленный запрос выше-Удалить, для случаев, когда у вас очень большая база данных. Этот запрос может быть быстрее:
Если IGNORE оператор не будет работать, как в моем случае, вы можете использовать следующий оператор:
есть еще одно решение:
удаление дубликатов в таблицах MySQL является общей проблемой, это в целом результат отсутствующего ограничения, чтобы избежать этих дубликатов перед рукой. Но эта общая проблема обычно связана с конкретными потребностями. это требует конкретных подходов. Подход должен быть различным в зависимости от, например, размера данных, дублированной записи, которая должна храниться (как правило, первая или последняя), есть ли индексы, которые должны храниться, или мы хотим выполнить какие-либо дополнительные действие над дублированными данными.
есть также некоторые особенности самого MySQL, такие как невозможность ссылаться на ту же таблицу по причине FROM при выполнении обновления таблицы (это вызовет ошибку MySQL #1093). Это ограничение можно преодолеть с помощью внутреннего запроса с временной таблицей (как предложено в некоторых подходах выше). Но этот внутренний запрос не будет работать особенно хорошо при работе с большими источниками данных.
однако существует лучший подход к удалите дубликаты, это эффективно и надежно, и это может быть легко адаптировано к различным потребностям.
общая идея состоит в том, чтобы создать новую временную таблицу, обычно добавляя уникальное ограничение, чтобы избежать дальнейших дубликатов, и вставить данные из вашей бывшей таблицы в новую, заботясь о дубликатах. Этот подход основан на простых запросах вставки MySQL, создает новое ограничение, чтобы избежать дальнейших дубликатов, и пропускает необходимость использования внутреннего запроса к поиск дубликатов и временной таблицы, которая должна храниться в памяти (таким образом, также подходят большие источники данных).
вот как это может быть достигнуто. Учитывая, что у нас есть таблица сотрудник, со следующими столбцами:
для того, чтобы удалить строки с повторяющимися ssn столбец, и сохраняя только первую запись, можно выполнить следующий процесс:
технические объяснение
⇒ используя этот подход, регистры 1.6 M были преобразованы в 6k менее чем за 200 секунд.
Четан, следуя этому процессу, вы можете быстро и легко удалить все свои дубликаты и создать Уникальное ограничение путем запуска:
конечно, этот процесс может быть дополнительно изменен, чтобы адаптировать его для различных потребностей при удалении дубликатов. Ниже приводятся некоторые примеры.
✔ вариация для сохранения последней записи вместо первой
иногда нам нужно сохранить последнюю дублированную запись вместо первой.
✔ вариация для выполнения некоторых задач на дубликатах, например, подсчет найденных дубликатов
иногда нам нужно выполнить некоторую дальнейшую обработку дублированных записей, которые найдены (например, сохранение количества дубликатов).
✔ вариация для регенерации автоматического инкрементного поля id
иногда мы используем автоматическое инкрементное поле и, чтобы сохранить индекс как можно более компактным, мы можем воспользоваться удаление дубликатов для регенерации автоматически инкрементного поля в новой временной таблице.
✔ дальнейшие вариации
многие дальнейшие модификации также выполнимы в зависимости от желаемого поведения. В качестве примера в следующих запросах будет использоваться вторая временная таблица кроме того, 1) сохранить последнюю запись вместо первой; и 2) увеличить счетчик на найденных дубликатах; также 3) регенерировать идентификатор автоматического инкрементного поля, сохраняя порядок ввода, как это было на предыдущих данных.
у меня есть этот запрос snipet для SQLServer, но я думаю, что его можно использовать в других СУБД с небольшими изменениями:
Я забыл сказать вам, что этот запрос не удаляет строку с самым низким идентификатором дублированных строк. Если это работает для вас, попробуйте этот запрос:
Убрать повторы
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Убрать повторы из ComboBox-а
Здравствуйте, мне нужно убрать повторы с комбобокса, прикладываю исходник помогите пожалуйста.
Убрать повторы из списка
Здравствуйте! Требуется убрать повторы из списка List. Список наполнен адресами сайтов (например.

Доброго времени суток! Возможно ли убрать повторы из richTB? И каким образом?Пож-та приведите.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Убрать повторы из списка фамилий
vector K; Form3->ListBox1->Items->Clear(); TStringList *l = new TStringList; string s.

Добрый день, помогите пожалуйста найти ошибку в программе. Она вроде легкая, но постоянно вылетают.

Программа должна вывести в мемо Фамилии студентов, по критериям. Как сделать так, чтобы фамилии.
Как убрать повторы из ListBox
Есть ListBox с набором записей. Эти записи повторяются. Как убрать повторяющиеся записи. Подскажите.
Удаление повторяющихся строк в MySQL
у меня есть таблица со следующими полями:
после выполнения этого запроса я могу удалить дубликаты с помощью сценария на стороне сервера.
но я хочу знать, можно ли это сделать только с помощью SQL-запроса.
17 ответов:
очень простой способ сделать это, чтобы добавить UNIQUE индекс по 3 столбцам. Когда вы пишете ALTER заявление, включают IGNORE ключевое слово. Вот так:
это приведет к удалению всех повторяющихся строк. В качестве дополнительного преимущества, будущее INSERTs это дубликаты будет ошибка. Как всегда, вы можете сделать резервную копию, прежде чем запускать что-то вроде этого.
Если вы не хотите изменять свойства столбца, то вы можете использовать запрос ниже.
Так как у вас есть столбец, который имеет уникальные идентификаторы (например, auto_increment столбцы), вы можете использовать его для удаления дубликатов:
MySQL имеет ограничения относительно ссылки на таблицу, из которой вы удаляете. Вы можете обойти это с помощью временной таблицы, как:
из предложения Костаноса в комментариях:
Единственный медленный запрос выше-Удалить, для случаев, когда у вас очень большая база данных. Этот запрос может быть быстрее:
Если IGNORE оператор не будет работать, как в моем случае, вы можете использовать следующий оператор:
удаление дубликатов в таблицах MySQL является общей проблемой, которая обычно является результатом отсутствующего ограничения, чтобы избежать этих дубликатов перед рукой. Но эта общая проблема обычно приходит с конкретными потребностями. это требует конкретных подходов. Подход должен быть различным в зависимости, например, от размера данных, дублированной записи, которая должна быть сохранена (обычно первая или последняя), есть ли индексы, которые нужно сохранить, или мы хотим выполнить какие-либо дополнительные действия действие на дублированные данные.
есть также некоторые особенности на самом MySQL, такие как невозможность ссылаться на ту же таблицу по причине FROM при выполнении обновления таблицы (это вызовет ошибку MySQL #1093). Это ограничение может быть преодолено с помощью внутреннего запроса с временной таблицей (как предложено в некоторых подходах выше). Но этот внутренний запрос не будет работать особенно хорошо при работе с большими источниками данных.
тем не менее, лучший подход существует для удалите дубликаты, которые являются эффективными и надежными, и которые могут быть легко адаптированы к различным потребностям.
общая идея состоит в том, чтобы создать новую временную таблицу, обычно добавляя уникальное ограничение, чтобы избежать дальнейших дубликатов, и вставить данные из вашей бывшей таблицы в новую, заботясь о дубликатах. Этот подход полагается на простые запросы вставки MySQL, создает новое ограничение, чтобы избежать дальнейших дубликатов, и пропускает необходимость использования внутреннего запроса к поиск дубликатов и временной таблицы, которые должны храниться в памяти (таким образом, соответствующие большие источники данных тоже).
вот как это может быть достигнуто. Учитывая, что у нас есть таблица сотрудник, со следующими столбцами:
для того, чтобы удалить строки с повторяющимися ssn столбец, и сохраняя только первую найденную запись, можно выполнить следующий процесс:
технические объяснение
⇒ используя этот подход, 1,6 м регистров были преобразованы в 6k менее чем за 200 секунд.
Четан, после этого процесса, вы можете быстро и легко удалить все ваши дубликаты и создать Уникальное ограничение при запуске:
конечно, этот процесс может быть дополнительно изменен, чтобы адаптировать его для различных потребностей при удалении дубликатов. Ниже приводятся некоторые примеры.
✔ вариация для сохранения последней записи вместо первой
иногда нам нужно сохранить последнюю дублированную запись вместо первой.
✔ вариация для выполнения некоторых задач на дубликатах, например ведение учета найденных дубликатов
иногда нам нужно выполнить некоторую дальнейшую обработку дублированных записей, которые найдены (например, сохранение количества дубликатов).
✔ вариация для регенерации автоматического инкрементного поля id
иногда мы используем автоматическое инкрементное поле и, чтобы сохранить индекс как можно более компактным, мы можем воспользоваться об удалении дубликатов для восстановления автоматически добавочного поля в новой временной таблице.
✔ дальнейшие вариации
многие дальнейшие модификации также выполнимы в зависимости от желаемого поведения. В качестве примера в следующих запросах будет использоваться вторая временная таблица чтобы, кроме того, 1) сохранить последнюю запись вместо первой; и 2) увеличить счетчик на найденных дубликатах; также 3) регенерировать автоинкрементный идентификатор поля, сохраняя порядок ввода, как это было на прежних данных.
у меня есть этот запрос snipet для SQLServer, но я думаю, что он может быть использован в других СУБД с небольшими изменениями:
Я забыл сказать вам, что этот запрос не удаляет строку с самым низким идентификатором дублированных строк. Если это работает для вас попробуйте этот запрос:
Удалить повторяющиеся строки в MySQL
У меня есть таблица со следующими полями:
После выполнения этого запроса я могу удалить дубликаты с помощью сценария на стороне сервера.
Но я хочу знать, можно ли это сделать только с помощью SQL-запроса.
25 ответов
Если вы не хотите изменять свойства столбца, вы можете использовать запрос ниже.
Поскольку у вас есть столбец с уникальными идентификаторами (например, столбцы auto_increment ), вы можете использовать его для удаления дубликатов:
В MySQL вы можете еще больше упростить его с помощью NULL-безопасный оператор равенства (также известный как «оператор космического корабля») :
MySQL имеет ограничения на обращение к таблице, из которой вы удаляете. Вы можете обойти это с помощью временной таблицы, например:
Если инструкция IGNORE не будет работать, как в моем случае, вы можете использовать следующую инструкцию:
В самом MySQL также есть некоторые особенности, такие как невозможность ссылаться на ту же таблицу по причине FROM при выполнении ОБНОВЛЕНИЯ таблицы (это вызовет ошибку MySQL # 1093). Это ограничение можно преодолеть, используя внутренний запрос с временной таблицей (как предложено в некоторых подходах выше). Но этот внутренний запрос не будет работать особенно хорошо при работе с большими источниками данных.
Однако существует лучший подход для удаления дубликатов, который одновременно эффективен и надежен и может быть легко адаптирован к различным потребностям.
Общая идея состоит в том, чтобы создать новую временную таблицу, обычно добавляя уникальное ограничение, чтобы избежать дальнейшего дублирования, и ВСТАВИТЬ данные из вашей предыдущей таблицы в новую, заботясь о дубликатах. Этот подход основан на простых запросах MySQL INSERT, создает новое ограничение, чтобы избежать дальнейших дубликатов, и пропускает необходимость использования внутреннего запроса для поиска дубликатов и временной таблицы, которая должна храниться в памяти (таким образом, подходящая для больших источников данных).
Вот как этого можно достичь. Учитывая, что у нас есть таблица employee со следующими столбцами:
Чтобы удалить строки с повторяющимся столбцом ssn и оставить только первую найденную запись, можно выполнить следующий процесс:
Техническое объяснение
⇒ При таком подходе 1,6 млн регистров были преобразованы в 6 КБ менее чем за 200 с.
Chetan, следуя этому процессу, вы можете быстро и легко удалить все свои дубликаты и создать ограничение UNIQUE, запустив:
Конечно, этот процесс можно дополнительно изменить, чтобы адаптировать его к различным потребностям при удалении дубликатов. Ниже приведены некоторые примеры.
✔ Вариант сохранения последней записи вместо первой
Иногда нам нужно сохранить последнюю дублированную запись вместо первой.
✔ Вариант выполнения некоторых задач с дубликатами, например, подсчет найденных дубликатов
Иногда нам нужно выполнить некоторую дополнительную обработку найденных дублированных записей (например, подсчитать количество дубликатов).
✔ Вариант для регенерации идентификатора автоинкрементного поля
Иногда мы используем автоинкрементное поле и, чтобы индекс оставался как можно более компактным, мы можем воспользоваться преимуществом удаления дубликатов для регенерации автоинкрементного поля в новой временной таблице.
✔ Дальнейшие вариации
Также возможны многие дальнейшие модификации в зависимости от желаемого поведения. В качестве примера следующие запросы будут использовать вторую временную таблицу, помимо 1) сохранения последней записи вместо первой; и 2) увеличить счетчик найденных дубликатов; также 3) регенерировать идентификатор автоинкрементного поля, сохраняя при этом порядок ввода, как это было в прежних данных.

