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

Название темы: Нестандартный SQL запрос
Показать сообщение отдельно

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


Сообщения: 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

Название темы: Нестандартный SQL запрос