![]() |
Нестандартный SQL запрос
Здравствуйте, помогите пожалуйста понять как лучше составить таблицу и запрос SQL.
неделю голову ломаю, с SQL знаком был только со стандартными простыми запросами. Цель: есть база данных объектов . у каждого есть ДО 10 координат x,y,z Составил таблицу примерно так.: Idобъекта ; Nкоординат ; x1 ; y1 ; z1; x2 ; y2 ; z2 ... ; x10 ; y10 ; z10 Цель: Найти другой объект, с которым совпадает наибольшее ЧИСЛО координат. Думал вынести координаты каждой точки в отдельную таблицу, но проще не становится. Есть ли варианты решения этой задачи??? PS. Таблица объектов в перспективе будет довольно большой: несколько тысяч объектов. |
Я не вижу никаких вариантов для запроса. Ибо нужно сравнивать каждую тройку координат искомого объекта с каждой тройкой координат всех остальных объектов. При совпадении — брать следующую тройку координат и сравнивать со всеми оставшимися тройками координат найденного объекта. Запоминать максимальное число совпадений и сам этот объект. Затем искать дальше, исключив найденный объект.
|
Спасибо. Тему оставлю открытой, на случай если вдруг у кого нибудь предложения еще найдутся.
|
Цитата:
Например, может быть объект в котором совпадают только координаты x и y, причем все, а z - все не совпадают, тогда такой объект имеет 20 совпадений - достаточно много, а он при алгоритме Iska выявляться не будет. По-моему, можно просто втупую перебирать все объекты и сравнивать соответсвующие координаты x1 c x1, y1 c y1 и т.п., а в 31 "координату"-счетчик S записывать-насчитывать совпадения. После перебора всех элементов базы надо будет просто отсортировать ее по убыванию счетчика. На простановку счетчиков - около 300 000 операций сравнения (много?). Сортировка - стандартная операция. Вообще для составления правильного алгоритма, надо понимать "физический смысл" математической модели, который не рассказан. |
Цитата:
Цитата:
|
Доброе утро!
Вчера прочитал эту тему, после Up темы. Пока ехал в электричке, было время немного поразмышлять. Так как в SQL я еще не силен, прошу сильно не пинать) Пришла в голову такая вот идея. Допустим у нас есть таблица с координатами, со структурой как предоставил Автор. Так же предполагаем, что координаты храняться в численном типе данных. Соответственно, получаем, что координаты совпадают при PHP код:
PHP код:
Для примера идет простая сортировка. Выводится столбец с исходным номером объекта (FindFor), другими объектами (Finded), и количеством совпадений (cnt). Полный код ниже. |
LilLoco, идея хороша. Но! Искать совпадения нужно не только среди Объект1.X1 и Объект2.X1, а Объект1.X1 и Объект2.X1 + Объект1.X1 и Объект2.X2 + … + Объект1.X1 и Объект2.XN и т.д. Понимаете? Придётся сравнивать каждую координату объекта со всеми координатами всех прочих объектов.
|
Цитата:
А если тогда просто изменить структуру таблицы, так чтобы не столбцы задавали координаты, а строки. Т.е. как то так: Id, ObjectId, CoordId, X, Y, Z где ObjectId - номер объекта, CoordId - порядковый номер координат, X,Y,Z - координаты. И после этого при Left Join сводить по не ObjectId и по не CoordId. Ну и немного изменить подзапрос? |
Цитата:
Код:
Объект1; 1,1,1; 2,2,2; 3,3,3. Цитата:
|
Цитата:
|
Время: 03:03. |
Время: 03:03.
© OSzone.net 2001-