Удаление дубликатов MySQL distinct
Если бы семантическая организация информации нашла своё воплощение в действительности, то область применения конструкции MySQL distinct моментально бы самоликвидировалась. Современные базы данных построены в рамках реляционных отношений между данными, поэтому задача удаления дубликатов записей актуальна.
Появление одинаковых строк, как правило, не является проблемой, которую невозможно решить, но избежать дублирования содержимого полей таблиц практически нереально во многих случаях.
Организация базы данных
Считается, что «правильная» база данных содержит уникальные таблицы, а каждая из них содержит уникальные поля. Допускается присутствие одинакового содержимого в полях разных таблиц только в том случае, когда они являются ключевыми и по ним осуществляется логическая связь данных.
Например, схема штатного расписания будет выходить на таблицу данных о сотрудниках по конкретному полю. Таблица штатного расписания содержит только то, что к ней относится в контексте конкретного предприятия, а список сотрудников содержит только личные данные персонала.
При таком варианте данных MySQL distinct будет работать на запросе к обеим таблицам, который соединяет штатное расписание с сотрудниками.
Уникальность таблиц и полей
При взаимодействии таблицы штатного расписания и списка сотрудников для каждой строки первой таблицы есть специальное место во второй. Вторая таблица может содержать одинаковые фамилии, имена, отчества людей, адреса проживания в городе также могут содержать идентичные улицы. Номера домов и квартир могут не иметь особого значения (они не занимают много места).
В идеале все одинаковые слова размещаются в разных таблицах и им соответствует уникальный ключ. Например, список всех улиц, фамилий, имён, отчеств. В таблице сотрудников первичные схемы сливаются в нужном варианте представления, а к таблице штатного расписания подключается не список сотрудников, а запрос к ней и тем, которые с ней связаны.
Чем более систематизирована информация, тем более актуально использование MySQL distinct. За правильную организацию данных приходится «платить» - при объединении таблиц общее количество строк выборки увеличивается пропорционально числу строк в каждой таблице. Это абстрактный пример, обычно разработчик не детализирует информацию до такой степени. Применение MySQL distinct решает эту проблему: будут выбраны только нужные записи.
Может стоять задача разбора абзацев на предложения, предложений на фразы, а фраз на слова. В этом случае без словаря не обойтись, а к нему придётся сделать словарики спряжений, окончаний и других элементов синтаксиса языка.
Пример выборки MySQL query "select distinct ..."
В таблице есть записи, в которых четыре времени года и два состояния записи: активная и пассивная. Примеры выборки:
- всех записей;
- только уникальных;
- уникальных в пределах условия.
Они могут быть такими, как указано на изображении в статье.
Функциональные возможности оператора выборки только уникальных записей удовлетворяют любым структурам данных. Можно использовать запрос в запросе, группировать и сортировать данные перед отбором.
Однако всегда предпочтительнее максимально упрощать работу с базой данных. Использование MySQL distinct по одному полю всегда предпочтительнее, чем работа сразу по нескольким.
Особенно важно внимательно составлять запросы, объединяющие несколько таблиц. Любое объединение данных в реляционных базах, до того как начнут функционировать конструкции where и join приводит к большим объёмам данных. Ориентация в них требует внимательности и аккуратности от разработчика.