MySQL Как получить результаты на основе порядка параметров в предложении WHERE - PullRequest
0 голосов
/ 21 февраля 2011

У меня есть следующий запрос:

SELECT idelm_na AS ID, nd.lat_nd AS lat, nd.lon_nd AS 'lon' , adr.road_adr AS 'road' 
FROM node_nd nd, node_address_na na, address_adr adr
WHERE 
    ((ROUND(lat_nd,6)=ROUND(14.654733,6) AND ROUND(lon_nd,6)=ROUND(121.058403,6)) OR 
    (ROUND(lat_nd,6)=ROUND(14.654791,6) AND ROUND(lon_nd,6)=ROUND(121.062386,6)) OR
    (ROUND(lat_nd,6)=ROUND(14.654791,6) AND ROUND(lon_nd,6)=ROUND(121.064343,6)) OR
    (ROUND(lat_nd,6)=ROUND(14.654754,6) AND ROUND(lon_nd,6)=ROUND(121.064403,6)) OR

    (ROUND(lat_nd,6)=ROUND(14.654648,6) AND ROUND(lon_nd,6)=ROUND(121.06445,6)) OR 
    (ROUND(lat_nd,6)=ROUND(14.653869,6) AND ROUND(lon_nd,6)=ROUND(121.064798,6)) OR
    (ROUND(lat_nd,6)=ROUND(14.653865,6) AND ROUND(lon_nd,6)=ROUND(121.065399,6)) OR
    (ROUND(lat_nd,6)=ROUND(14.653880,6) AND ROUND(lon_nd,6)=ROUND(121.066532,6)))
AND na.idelm_na = nd.idelm_nd AND adr.id_adr = na.idadr_na;

Что он делает, так это то, что возвращает adr.road_adr , связанный с координатами (широта, долгота). То, что он возвращает, упорядочено по умолчанию idelm_na . Есть ли способ переписать этот код, который будет возвращать результат на основе порядка ИЛИ аргументов / параметров? Я могу использовать UNION ALL с отдельными инструкциями SELECT, но я думаю, что это слишком медленно. Я надеюсь, что кто-то может помочь мне здесь. Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Во-первых, не используйте разделенный запятыми синтаксис для объединений.Используйте стандарт ISO.Во-вторых, чтобы достичь того, чего вы хотите, вам нужно построить запрос по-другому.Вы можете достичь того, что вы хотите, если вы поставите порядок сортировки для входов.Помимо предоставления возможности выполнять сортировку, вы также облегчаете построение списка входных данных:

Select idelm_na AS ID, nd.lat_nd AS lat, nd.lon_nd AS 'lon' , adr.road_adr AS 'road' 
From node_nd As ND
    Join node_address As NA
        On NA.idelm_nd = ND.idelm_na
    Join address_adr As ADR
        On ADR.id_adr = NA.idadr_na
    Join    (
            Select 1 As Rnk, 14.654733 As Lat, 121.058403 As Lon
            Union All Select 2, 14.654791, 121.062386
            Union All Select 3, 14.654791, 121.064343
            Union All Select 4, 14.654754, 121.064403
            Union All Select 5, 14.654648, 121.064450
            Union All Select 6, 14.653869, 121.064798
            Union All Select 7, 14.653865, 121.065399
            Union All Select 8, 14.653880, 121.066532
            ) As Z
        On Round(lat_nd, 6) = Z.Lat
            And Round(lon_nd, 6) = Z.Lon
Order By Z.Rnk
0 голосов
/ 21 февраля 2011

Вы можете добавить предложение "ORDER BY" в оператор SELECT:

SELECT idelm_na AS ID, ... WHERE ... ORDER BY lat_nd, lon_nd;

Это приведет к сортировкерезультаты сначала по lat_nd, затем по lon_nd.

...