Как преобразовать этот запрос в концепцию производной таблицы

Обновлено:

Как ввести этот запрос ниже в производные таблицы

(3959 * acos (cos (радианы (36.247137)) * cos (радианы (_1 _._ 2_)) * cos (радианы (_3 _._ 4_) - радианы (-115.221032)) + sin (радианы (36.247137)) * sin (радианы (_5 _._ 6_)))) AS расстояние

в этом запросе MySql:

MySql запрос:

SELECT ( 3959 * acos( cos( radians(36.247137) ) * cos( radians( `cm`.`lat` ) ) * cos( radians(`cm`.`lng` ) - radians(-115.221032) ) + sin( radians(36.247137) ) * sin( radians( `cm`.`lat` ) ) ) ) AS distance, min(pl.price_pure) as minPrice, max(pl.price_pure) as maxPrice, min(pl.`squarefeet_pure`) as minSquare, max(pl.`squarefeet_pure`) as maxsquare FROM  `plans` pl INNER JOIN property pr ON pr.id = pl.property_id INNER JOIN communities cm ON cm.id = pr.community_id Having distance < 20 order by pl.price_pure, pl.squarefeet_pure

............................................... ...........................

Предыдущий заголовок запроса был: Почему нет результата при применении формулы цены Max, MIN в запросе MySql

Подробный вопрос:

http://pastebin.com/UR48mbtq вот мой запрос mysql .. я хочу получить максимум и минимум цена домов, которые падают на расстояние менее 20 миль .. но результат нулевой. Расстояние в примере 20, но я также привел в своей базе данных 20 миль и менее 20 миль.

MySql запрос:

SELECT ( 3959 * acos( cos( radians(36.247137) ) * cos( radians( `cm`.`lat` ) ) * cos( radians(`cm`.`lng` ) - radians(-115.221032) ) + sin( radians(36.247137) ) * sin( radians( `cm`.`lat` ) ) ) ) AS distance, min(pl.price_pure) as minPrice, max(pl.price_pure) as maxPrice, min(pl.`squarefeet_pure`) as minSquare, max(pl.`squarefeet_pure`) as maxsquare FROM  `plans` pl INNER JOIN property pr ON pr.id = pl.property_id INNER JOIN communities cm ON cm.id = pr.community_id Having distance < 20 order by pl.price_pure, pl.squarefeet_pure

С этим результатом:

distance              minPrice   maxPrice   minSquare   maxsquare
1754.3401139613718       0       21000003     0            8607

Но когда я добавляю предложение Have, результат будет равен нулю с запросом ниже

SELECT ( 3959 * acos( cos( radians(36.247137) ) * cos( radians( `cm`.`lat` ) ) * cos( radians(`cm`.`lng` ) - radians(-115.221032) ) + sin( radians(36.247137) ) * sin( radians( `cm`.`lat` ) ) ) ) AS distance, (pl.price_pure) as minPrice, (pl.price_pure) as maxPrice, (pl.`squarefeet_pure`) as minSquare, (pl.`squarefeet_pure`) as maxsquare FROM  `plans` pl INNER JOIN property pr ON pr.id = pl.property_id INNER JOIN communities cm ON cm.id = pr.community_id Having distance < 20 order by pl.price_pure, pl.squarefeet_pure

Обновление: если я удаляю формулу max, min из запроса, она также дает мне результат 400 ..


person Puzzled Boy    schedule 25.01.2017    source источник
comment
вместо того, чтобы попробовать, где?   -  person krishn Patel    schedule 25.01.2017
comment
@krishnpatel его виртуальное поле, и я не могу здесь подать заявку. также я пробовал раньше.   -  person Puzzled Boy    schedule 25.01.2017
comment
CAST (Дистанционный логин КАК НЕ ПОДПИСАННЫЙ) КАК расстояние. ты можешь попробовать это   -  person krishn Patel    schedule 25.01.2017
comment
расстояние ‹20 означает 1754,34‹ 20 ложно. вы должны написать , чтобы получить эти данные   -  person krishn Patel    schedule 25.01.2017
comment
@krishnpatel Я хочу найти результат до 20 миль .. это не должно быть больше 20 миль ..   -  person Puzzled Boy    schedule 25.01.2017


Ответы (2)


Having - это предложение, которое применяется после создания строк запроса. Поскольку в вашем запросе есть агрегатные функции, но нет GROUP BY, mysql предоставляет вам один (образец) distance результат, а затем минимальное и максимальное значение для всего набора данных.

После этого применяется предложение having - и, как указал @krishnpatel, 1754 ‹20 ложно, так что эта строка удаляется, и у вас ничего не остается.

Добавьте GROUP BY в свой выбор, что эквивалентно вашему вычислению distance, чтобы получить результат, который вы ищете.

person pbeentje    schedule 25.01.2017

Сначала соберите идентификаторы собственности в радиусе 20 миль.

Затем используйте это как подзапрос и JOIN в основную таблицу, чтобы сделать все остальное:

SELECT MIN(...), ...
    FROM ( SELECT id FROM tbl WHERE ... < 20 ) AS x
    JOIN tbl ON x.id = tbl.id;

Нет HAVING, нет GROUP BY (если я что-то не пропустил).

person Rick James    schedule 25.01.2017