alexhemp
Новичок
Вычисление транзитивного отношения
Задача весьма теоретическая, но для меня имеющая практическое воплощение - расширение условий поиска.
Итак, существует таблица
X CHAR(30), Y CHAR(30)
В ней записано множество значений
например
A1 B1
B1 C1
A1 B2
....
т.е. по сути задана таблица синонимов
Но, она не полна, ибо существует транзитивность отношения
Требуется написать запрос который бы по заданному значению возвращал список всех синонимов, т.е. разрешал отношения, а именно делал вывод
Если A1 = B1 и B1 = C1 то A1 = C1
Пока в голову приходит поиграть в направлении
SELECT X, Y FROM table UNION DISTINCT SELECT Y, X FROM table
Потом нужно как-то самообъединить результат чтобы найти цепочки длиной два, и продолжать итерации пока не будут найдены все цепочки...
Вычисления могут быть долгими, но прямой перебор писать на php не хочется совсем...
Задача весьма теоретическая, но для меня имеющая практическое воплощение - расширение условий поиска.
Итак, существует таблица
X CHAR(30), Y CHAR(30)
В ней записано множество значений
например
A1 B1
B1 C1
A1 B2
....
т.е. по сути задана таблица синонимов
Но, она не полна, ибо существует транзитивность отношения
Требуется написать запрос который бы по заданному значению возвращал список всех синонимов, т.е. разрешал отношения, а именно делал вывод
Если A1 = B1 и B1 = C1 то A1 = C1
Пока в голову приходит поиграть в направлении
SELECT X, Y FROM table UNION DISTINCT SELECT Y, X FROM table
Потом нужно как-то самообъединить результат чтобы найти цепочки длиной два, и продолжать итерации пока не будут найдены все цепочки...
Вычисления могут быть долгими, но прямой перебор писать на php не хочется совсем...