Проблема в том, что у вас нет условий для разделения 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>
Это избавит от большинства дубликатов.Если в базе данных также есть правильные дубликаты, они создадут несколько дублирующих строк в наборе результатов вышеупомянутого запроса.Причина в том, что «дубликат» может быть обнаружен как «дубликат» двух разных соответствующих строк, которые, в свою очередь, являются фактическими дубликатами друг друга.