Удаление несколько дублирующихся записей в таблице с использованием MySQL - PullRequest
0 голосов
/ 03 марта 2011

У меня есть таблица, которая сравнивает конкурентоспособность маршрутов авиакомпаний в США. Итак, некоторые из полей в таблице - это id, route_id1, route_id2, aviation_id1, aircraft_id2, sources_airport_id и destination_airport_id. Эта таблица является результатом самостоятельного присоединения к таблице маршрутов, которая состоит из карт маршрутов. Но в результате таблица имеет несколько дублирующих записей.

Например,
Маршрут 1 конкурирует с маршрутом 2, потому что они имеют одинаковые source_airport и destination_airport, но разные авиакомпании_id. Но у меня есть две записи, сравнивающие route1 с route2 и route2 с route1. Это одно и то же сравнение, но только по-разному.

Я попытался получить дубликаты, присоединившись самостоятельно:
ВЫБЕРИТЕ t1. * ОТ маршрутов AS t1, маршрутов AS t2 ГДЕ t1.route_id1 = t2.route_id2 И t1.route_id2 = t2.route_id1
Но этот запрос просто получает такое же количество записей в таблице.

Как мне избавиться от «дубликатов» данных?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Проблема в том, что у вас нет условий для разделения t1 и t2.Сначала вы получите дубликаты, где t1 и t2 поменялись местами.Во-вторых, если какие-либо строки имеют route_id1 = route_id2, вы получите эти строки и в t1, и в t2 набора результатов.

Самый простой способ обойти это:

SELECT t1.* FROM routes AS t1, routes AS t2 
WHERE t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1
      AND t2.id > t1.id

Дополнительный критерий заключается в том, что одна строка должна иметь больший идентификатор, чем другая.Это означает, что t1, как возвращено, всегда будет строкой с более низким идентификатором.Конечно, вы можете заменить его на <или поменять местами параметры, чтобы получить строку с верхним идентификатором. </p>

Это избавит от большинства дубликатов.Если в базе данных также есть правильные дубликаты, они создадут несколько дублирующих строк в наборе результатов вышеупомянутого запроса.Причина в том, что «дубликат» может быть обнаружен как «дубликат» двух разных соответствующих строк, которые, в свою очередь, являются фактическими дубликатами друг друга.

0 голосов
/ 03 марта 2011

Вы пробовали использовать "SELECT DISTINCT t1.* FROM ..."?

0 голосов
/ 03 марта 2011

в select используют фактические имена полей и используют предложение DISTINCT вместо использования t1. *. в списке полей убедитесь, что вы не указали авиакомпанию, поскольку они отличаются, и они сделают ваши записи не дублирующимися.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...