Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MySQL - Нестандартный SQL запрос

Ответить
Настройки темы
MySQL - Нестандартный SQL запрос

Пользователь


Сообщения: 78
Благодарности: 17

Профиль | Отправить PM | Цитировать


Здравствуйте, помогите пожалуйста понять как лучше составить таблицу и запрос SQL.
неделю голову ломаю, с SQL знаком был только со стандартными простыми запросами.

Цель: есть база данных объектов . у каждого есть ДО 10 координат x,y,z
Составил таблицу примерно так.:

Idобъекта ; Nкоординат ; x1 ; y1 ; z1; x2 ; y2 ; z2 ... ; x10 ; y10 ; z10

Цель: Найти другой объект, с которым совпадает наибольшее ЧИСЛО координат.

Думал вынести координаты каждой точки в отдельную таблицу, но проще не становится.

Есть ли варианты решения этой задачи???

PS. Таблица объектов в перспективе будет довольно большой: несколько тысяч объектов.

Отправлено: 09:30, 28-05-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Я не вижу никаких вариантов для запроса. Ибо нужно сравнивать каждую тройку координат искомого объекта с каждой тройкой координат всех остальных объектов. При совпадении — брать следующую тройку координат и сравнивать со всеми оставшимися тройками координат найденного объекта. Запоминать максимальное число совпадений и сам этот объект. Затем искать дальше, исключив найденный объект.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:28, 28-05-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 78
Благодарности: 17

Профиль | Отправить PM | Цитировать


Спасибо. Тему оставлю открытой, на случай если вдруг у кого нибудь предложения еще найдутся.

Отправлено: 16:16, 28-05-2013 | #3


Ветеран


Сообщения: 1630
Благодарности: 220

Профиль | Отправить PM | Цитировать


Цитата Iska:
Я не вижу никаких вариантов для запроса. Ибо нужно сравнивать каждую тройку координат искомого объекта с каждой тройкой координат всех остальных объектов. »
Откуда следует именно такой алгоритм поиска? В исходной постановке такого нет, имхо.
Например, может быть объект в котором совпадают только координаты x и y, причем все, а z - все не совпадают, тогда такой объект имеет 20 совпадений - достаточно много, а он при алгоритме Iska выявляться не будет.

По-моему, можно просто втупую перебирать все объекты и сравнивать соответсвующие координаты x1 c x1, y1 c y1 и т.п.,
а в 31 "координату"-счетчик S записывать-насчитывать совпадения.
После перебора всех элементов базы надо будет просто отсортировать ее по убыванию счетчика.
На простановку счетчиков - около 300 000 операций сравнения (много?). Сортировка - стандартная операция.

Вообще для составления правильного алгоритма, надо понимать "физический смысл" математической модели, который не рассказан.

Отправлено: 14:37, 05-06-2013 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата rus-4-ever:
есть база данных объектов . у каждого есть ДО 10 координат x,y,z

Найти другой объект, с которым совпадает наибольшее ЧИСЛО координат. »
Цитата alef2474:
Например, может быть объект в котором совпадают только координаты x и y, причем все, а z - все не совпадают »
alef2474, поздравляю! Не каждому удаётся так просто сказать новое слово в Евклидовой геометрии .

Отправлено: 16:40, 05-06-2013 | #5


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Доброе утро!

Вчера прочитал эту тему, после Up темы. Пока ехал в электричке, было время немного поразмышлять. Так как в SQL я еще не силен, прошу сильно не пинать) Пришла в голову такая вот идея.

Допустим у нас есть таблица с координатами, со структурой как предоставил Автор. Так же предполагаем, что координаты храняться в численном типе данных. Соответственно, получаем, что координаты совпадают при
PHP код: Выделить весь код

(x1-x2) + (y1-y2) + (z1-z2) = 

Всего координат может быть до 10. Значит необходимо посчитать сколько "нулей" получается в выражении. Для этого объединяем все эти 10 выражений через Union, и ищем сумму таких выражений. Причем, если выражение равно нулю, то для Union используем 1. Кусок кода:
PHP код: Выделить весь код

SELECT SUM(XFROM (
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.*, ROW_NUMBER() OVER (PARTITION BY aa.FindFor Order By cnt DESC)
FROM (Select FindFor a.idFinded b.idcnt = (SELECT SUM(XFROM (
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.idaa 

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 09:33, 06-06-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


LilLoco, идея хороша. Но! Искать совпадения нужно не только среди Объект1.X1 и Объект2.X1, а Объект1.X1 и Объект2.X1 + Объект1.X1 и Объект2.X2 + … + Объект1.X1 и Объект2.XN и т.д. Понимаете? Придётся сравнивать каждую координату объекта со всеми координатами всех прочих объектов.

Отправлено: 09:55, 06-06-2013 | #7


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Iska:
Понимаете? »
Теперь да) Думал, что только соответствующие Просто не совсем понятно, как объект может задаваться несколькими координатами.

А если тогда просто изменить структуру таблицы, так чтобы не столбцы задавали координаты, а строки.
Т.е. как то так:
Id, ObjectId, CoordId, X, Y, Z
где ObjectId - номер объекта,
CoordId - порядковый номер координат,
X,Y,Z - координаты.
И после этого при Left Join сводить по не ObjectId и по не CoordId. Ну и немного изменить подзапрос?

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 10:34, 06-06-2013 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата LilLoco:
Теперь да) Думал, что только соответствующие »
Угу. Я тоже поначалу точно так думал. Начал лепить таблицу, затем запрос… А спустя время осознал, что в принципе-то может быть и так:
Код: Выделить весь код
Объект1; 1,1,1; 2,2,2; 3,3,3.
Объект2; 2,2,2; 3,3,3; 1,1,1.
(утрирую, конечно, но суть видна).

Цитата LilLoco:
А если тогда просто изменить структуру таблицы, так чтобы не столбцы задавали координаты, а строки. »
Меня тоже весьма удивили объекты со строго ограниченным и равным числом вершин (число координат N жёстко определено структурой таблицы).

Отправлено: 11:16, 06-06-2013 | #9


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Iska:
Меня тоже весьма удивили объекты »
Видимо, нужно дождаться автора темы для разъяснения и примера, что ли. А то вариантов, я вижу, достаточно много, а какой является для автора необходимым - неизвестно.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 12:00, 06-06-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MySQL - Нестандартный SQL запрос

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - запрос SQL virus8 Программирование и базы данных 3 15-05-2013 16:35
Delphi - SQL запрос с параметром iliya24 Программирование и базы данных 1 30-01-2010 10:28
sql запрос E-mail Вебмастеру 20 30-12-2006 22:31
SQL запрос pauluss Вебмастеру 5 11-06-2004 09:14
SQL-запрос anridir Программирование и базы данных 2 23-09-2002 07:11




 
Переход