0

Существует таблица distances(city1, city2, dist), которая перечисляет пару городов и расстояния между ними. Дело в том, что из этой информации мы можем получить больше расстояний, как в таблице distances dist A -> B и dist B -> C, чтобы мы могли получить A -> C, который не находится в distances.MySQL транзитное закрытие дистанционной радиосвязи

Задача состоит в создании таблицы distances_tr(city1, city2, dist) с транзитивным закрытием 1-й таблицы, которая будет включать (A, C, dist(A,C)).

Как я могу достичь, используя PROCEDURE и простые команды SQL SELECT, INSERT, UPDATE? Я знаю, что это можно сделать рекурсивно, но профессор сказал нам сделать это в обоих направлениях.

+0

Вы ищете только расчеты расстояния второго порядка или это проблема коммивояжера? (BTW есть тег для этого) – symcbean

ответ

0

Соединитесь с таблицей для себя на city2 с одной стороны на город1 с другой. Предположение здесь состоит в том, что нет записей, где комбинация city1 и city2 находится там дважды, когда города перевернуты. Если они есть, включите фильтр для фильтрации, где city1 с одной стороны равен city2 с другой.

+0

Но если на 'расстояниях' есть расстояние A-B, B-C и C-D, то с вашим методом я получу только A-C (A-B-C) и B-D (B-C-D), да? Но также можно будет генерировать расстояние от A-D (A-B-C-D) –

0

Создайте процедуру, которая сначала копирует расстояния на расстояния_tr, затем повторно вставляет соединение расстояний с расстояниями_tr до тех пор, пока не будет обновлено больше строк. Убедитесь, что вы правильно определили первичный ключ в комбинации city1 и city2, а при вставке строк с дублирующимися ключами вы можете обновить distances_tr с наименьшим из существующих значений и суммой расстояний от соединения.

 Смежные вопросы

  • Нет связанных вопросов^_^