Grails executeQuery с помощью Acos/имея/перекрестного соединения

Я хочу выполнить запрос для zip-поиска. У меня есть такая доменная модель:

class Zip_data {
int zc_loc_id 
String zc_zip 
String zc_location_name 
double zc_lat 
double zc_lon

static constraints = {
    zc_loc_id()
    zc_zip()
    zc_location_name()
    zc_lat()
    zc_lon()
}
}

И теперь я пытаюсь выполнить следующий запрос через метод «Zip_data.executeQuery (запрос)»:

SELECT 
        dest.zc_zip, 
        dest.zc_location_name,
        ACOS(
             SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat)) 
             + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
             * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
        ) * 6380 AS distance
    FROM zip_data dest
    CROSS JOIN zip_data src
    WHERE src.zc_zip = 20537
    AND dest.zc_loc_id <> src.zc_loc_id
    HAVING distance < 10
    ORDER BY distance

Но все время я получаю некоторые ошибки из-за того, что «CROSS JOIN» или «HAVING» не разрешены, или «zip_data не сопоставлен» или что-то в этом роде...

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

Кто-нибудь может помочь мне выполнить этот запрос?

Спасибо за помощь!

Гретц

V

Изменить: я хочу использовать данные "http://opengeodb.org/wiki/OpenGeoDB. Разве нельзя выполнить случайный запрос к базе данных для объекта по умолчанию или любого другого объекта и получить массив хэшей? Или можно создать дополнительный выбор, чтобы дважды сопоставить одну и ту же таблицу? Я попытался создать этот запрос более простым способом:

SELECT 
dest.zc_zip, 
dest.zc_location_name,
(Select (ACOS(
     SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat)) 
     + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
     * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
) * 6380) FROM zip_data as src where src.zc_loc_id<>dest.zc_loc_id and src.zc_loc_id = 20537)
AS distance
FROM zip_data dest

Я знаю, что это не тот же SQL, но я также получаю сообщение об ошибке: zip_data не сопоставлен. Есть ли способ отобразить его и использовать так?


person Der_V    schedule 01.09.2013    source источник
comment
Объясните, что вы пытаетесь запросить на английском языке.   -  person James Kleeh    schedule 01.09.2013
comment
Мне нужен этот запрос для zip-поиска. Я хочу получить все почтовые индексы с расстоянием 10 километров вокруг почтового индекса «20537». У меня есть база данных со всей этой информацией, где я обычно могу выполнить поиск по этому запросу. Я знаю, как я могу избежать использования CROSS JOIN с обычным INNER JOIN, но я не могу снова присоединиться к таблице zip_data... И, похоже, я не могу использовать наличие или как я мог используй это?   -  person Der_V    schedule 02.09.2013


Ответы (1)


Хорошо, теперь я нашел решение. Я не знаю почему, но это казалось невозможным в одном sql из-за соединения... Я не уверен, что в запросе есть еще одна ошибка (возможно, дело в имени таблицы или что-то еще), но я получаю его с двумя запросами: сначала я получаю данные исходного почтового индекса (место, где я хочу начать поиск по радиусу)

def sourcePlz = Zip_data.findByZc_zip('20537')

После этого я могу выполнить поиск с примерным радиусом 10 километров:

def query = """FROM Zip_data as dest WHERE dest.zc_lat IS NOT NULL AND dest.zc_lon IS
                    NOT NULL
                    AND 6371.0*ACOS(
                    COS(RADIANS(dest.zc_lat))*COS(RADIANS(:qlat))*COS(RADIANS(dest.zc_lon)-RADIANS(:qlon))
                    + SIN(RADIANS(dest.zc_lat))*SIN(RADIANS(:qlat)) ) < :qradius 
                    """
        plz_objs = Zip_data.executeQuery(query, [qlat:sourcePlz.zc_lat, qlon:sourcePlz.zc_lon, qradius:umkreis.toDouble()])

И все :) Получаю все зипы исходников в радиусе 10 километров. Я надеюсь, что это поможет всем, кто пробовал то же самое.

Гретц

V

person Der_V    schedule 05.09.2013