Доброе утро!
Вчера прочитал эту тему, после Up темы. Пока ехал в электричке, было время немного поразмышлять. Так как в SQL я еще не силен, прошу сильно не пинать) Пришла в голову такая вот идея.
Допустим у нас есть таблица с координатами, со структурой как предоставил Автор. Так же предполагаем, что координаты храняться в численном типе данных. Соответственно, получаем, что координаты совпадают при
PHP код:

(x1-x2) + (y1-y2) + (z1-z2) = 0
Всего координат может быть до 10. Значит необходимо посчитать сколько "нулей" получается в выражении. Для этого объединяем все эти 10 выражений через Union, и ищем сумму таких выражений. Причем, если выражение равно нулю, то для Union используем 1. Кусок кода:
PHP код:

SELECT SUM(X) FROM (
SELECT CASE WHEN ((X1 - X1) + (Y1 - Y1) + (Z1 - Z1)) = 0 THEN 1 ELSE 0 END AS X
UNION ALL
SELECT CASE WHEN ((X2 - X2) + (Y2 - Y2) + (Z2 - Z2)) = 0 THEN 1 ELSE 0 END
UNION ALL
SELECT CASE WHEN ((X3 - X3) + (Y3 - Y3) + (Z3 - Z3)) = 0 THEN 1 ELSE 0 END
...
UNION ALL
SELECT CASE WHEN ((Xn - Xn) + (Yn - Yn) + (Zn - Zn)) = 0 THEN 1 ELSE 0 END)
Ну а далее - дело фантазии.
Для примера идет простая сортировка. Выводится столбец с исходным номером объекта (FindFor), другими объектами (Finded), и количеством совпадений (cnt).
Полный код ниже.
читать дальше »
PHP код:

SELECT aa.*, X = ROW_NUMBER() OVER (PARTITION BY aa.FindFor Order By cnt DESC)
FROM (Select FindFor = a.id, Finded = b.id, cnt = (SELECT SUM(X) FROM (
SELECT CASE WHEN ((X1 - X1) + (Y1 - Y1) + (Z1 - Z1)) = 0 THEN 1 ELSE 0 END AS X
UNION ALL
SELECT CASE WHEN ((X2 - X2) + (Y2 - Y2) + (Z2 - Z2)) = 0 THEN 1 ELSE 0 END
UNION ALL
SELECT CASE WHEN ((X3 - X3) + (Y3 - Y3) + (Z3 - Z3)) = 0 THEN 1 ELSE 0 END
...
UNION ALL
SELECT CASE WHEN ((Xn - Xn) + (Yn - Yn) + (Zn - Zn)) = 0 THEN 1 ELSE 0 END) d)
from Таблица a
left join Таблица b on a.id <> b.id) aa