Нужна помощь в понимании этого sql - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь расшифровать этот оператор SQL. В частности, какие местоположения z, местоположения o, местоположения означают. Что значит z o и что значит в этом случае? Смущен: (

SELECT o.zip_code
FROM locations z, locations o, locations a

WHERE z.zip_code = #{zip_code}
AND z.zip_code = a.zip_code
AND (3956 * (2 * ASIN(SQRT(
        POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
        COS(z.latitude*0.017453293) *
        COS(o.latitude*0.017453293) *
        POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
    )))) <= #{distance}

Ответы [ 7 ]

2 голосов
/ 27 июля 2011

Это декартово произведение таблицы местоположений с собой, дважды. Поскольку запрос соединяет одну и ту же таблицу с самим собой, необходимо переименовать каждую часть, чтобы их можно было однозначно идентифицировать позже в запросе. z, o и a - это имена.

Посмотрите на пример два здесь (http://www.fluffycat.com/SQL/Cartesian-Joins/), чтобы увидеть, что происходит. За исключением этого случая, вместо одного есть два декартовых произведения. Все на одной таблице.

Сам запрос потенциально может быть довольно медленным, так как он выполняет двойной декартовой продукт, он создаст временную таблицу с n³ строками и (3m) столбцами, где n - это количество строк в таблице местоположений, а m - это число столбцы.

Редактировать В ответ на комментарий. Я не уверен в этом, но после прочтения вашего запроса я считаю, что он находит все почтовые индексы, которые находятся на определенном расстоянии от другого почтового индекса. Похоже, что третий декартовой продукт (местоположения а) даже не используется, поэтому вы можете уменьшить запрос до:

SELECT o.zip_code
FROM locations z, locations o

WHERE z.zip_code = #{zip_code}
AND (3956 * (2 * ASIN(SQRT(
        POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
        COS(z.latitude*0.017453293) *
        COS(o.latitude*0.017453293) *
        POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
    )))) <= #{distance}

Но у этого все еще есть одно декартово произведение. Было бы лучше, если бы мы могли избавиться от этого:

SELECT zip_code
FROM locations

WHERE (3956 * (2 * ASIN(SQRT(
        POWER(SIN((((SELECT latitude FROM locations WHERE zip_code = #{zip_code})-latitude)*0.017453293)/2),2) +
        COS((SELECT latitude FROM locations WHERE zip_code = #{zip_code})*0.017453293) *
        COS(latitude*0.017453293) *
        POWER(SIN((((SELECT longitude FROM locations WHERE zip_code = #{zip_code})-longitude)*0.017453293)/2),2)
    )))) <= #{distance}

Вероятно, будет очень хорошо оптимизирован MySQL

2 голосов
/ 27 июля 2011

Это сокращение для

 locations AS z, locations AS o, locations AS a

Или, другими словами, это псевдонимы.

Вместо того, чтобы продолжать писать locations во всем коде, оригинальный автор выбрал псевдонимы для них, в данном случае z o и a.

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

2 голосов
/ 27 июля 2011

это псевдоним таблицы ...

Aliases are powerful for complex queries that need to 
    use the same table twice but in different ways.

В этом запросе предложение FROM задает псевдонимы для имен таблиц.Псевдоним location z означает, что таблица местоположения может упоминаться как z в другом месте запроса.Например, z.zip_code совпадает с location.zip_code.Это экономит ввод в этом запросе.

ССЫЛКА

1 голос
/ 27 июля 2011
  • z содержит запись, которую вы ищете, используя # {zip_code} (контрольная точка)

  • a - это та же запись, что и z

  • o содержит все записи, которые находятся на географическом расстоянии # {distance}

короче:

Он находит все почтовые индексы, которые находятся в круге с радиусом # {расстояние} вокруг z

Кстати, 3956 - это радиус Земли в милях (приблизительно), поэтому вы получите результат в милях;)

Если вы заинтересованы в этом, вы можете прочитать больше на http://www.movable -type.co.uk / scripts / gis-faq-5.1.html

0 голосов
/ 27 июля 2011

Буквы являются псевдонимами таблиц, по сути, это псевдонимы, которые разработчик SQL дал таблице расположений.Одна и та же таблица местоположений объединена с использованием трех разных имен, поскольку это одна таблица, которая позволяет различать различные варианты использования таблицы местоположений.

местоположения были переименованы в z, местоположения были переименованы в o, местоположения былипереименовано в

Измените z на местоположения1 Измените o на местоположения2 и измените a на местоположения3, если это поможет вам прочитать SQL

0 голосов
/ 27 июля 2011

Это сокращение для имен таблиц, поэтому вместо ввода locations.zip_code оно сокращается до a.zip_code

Это также помогает в этом экзамене, так как одна и та же таблица выбирается из 3 раз.

0 голосов
/ 27 июля 2011

Похоже, он пытается выбрать все почтовые индексы в пределах # {расстояния} от почтового индекса $ {zip_code}.

Я думаю, что его пост дает хорошее объяснение закона косинусов, используемых для этой конкретной цели: http://blog.cleverly.com/archive/2000-03.html

z, o и a являются псевдонимами, потому что одна и та же таблицаприсоединяется 3 раза к себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...