Php 从数据库中获取lat/lng点的距离
我有以下SQL查询:Php 从数据库中获取lat/lng点的距离,php,mysql,geolocation,Php,Mysql,Geolocation,我有以下SQL查询: SELECT vac.vacancy_id AS vacancy_id, vac.title AS vacancy_title, vac.slug AS vacancy_slug, vac.company_name AS vacancy_company_name, vac.c
SELECT
vac.vacancy_id AS vacancy_id,
vac.title AS vacancy_title,
vac.slug AS vacancy_slug,
vac.company_name AS vacancy_company_name,
vac.company_latitude AS vacancy_company_latitude,
vac.company_longitude AS vacancy_company_longitude,
cat.slug AS vacancy_category_slug,
(
6371 *
acos(
cos( radians( :latitude ) ) *
cos( radians( vac.company_latitude ) ) *
cos(
radians( vac.company_longitude ) - radians( :longitude )
) +
sin( radians( :latitude ) ) *
sin( radians( vac.company_latitude ) )
)
) AS distance
FROM
vacancies vac
JOIN
vacancies_categories cat
ON
vac.vacancy_category_id = cat.vacancy_category_id
WHERE
vac.subdomain = :subdomain
AND
distance < :distance
AND
vac.company_latitude IS NOT NULL
AND
vac.company_longitude IS NOT NULL
我还尝试了WHERE子句之前的HAVING子句(HAVING distance<:distance),但这也不起作用
有人有主意吗
提前谢谢 在MySQL(或大多数其他数据库)中不可能重用
WHERE
子句中的SELECT
子句中定义的别名。这与计算WHERE
子句时别名不可用有关
MySQL有一个方便的特性,即重载的具有
操作符,可以像WHERE
子句一样使用。此外,此具有
运算符可以使用别名。因此,您可以尝试将对距离别名的检查移动到HAVING
子句:
WHERE
vac.subdomain = :subdomain AND
vac.company_latitude IS NOT NULL AND
vac.company_longitude IS NOT NULL
HAVING
distance < :distance;
在哪里
vac.subdomain=:子域和
vac.company_纬度不为空且
vac.U经度不为空
有
距离<:距离;
如果出于某种原因您不喜欢这种方法,那么替代方法可能是在
WHERE
子句中重复distance
的整个表达式。在MySQL(或大多数其他数据库)中不可能重用WHERE
子句中的SELECT
子句中定义的别名。这与计算WHERE
子句时别名不可用有关
MySQL有一个方便的特性,即重载的具有
操作符,可以像WHERE
子句一样使用。此外,此具有
运算符可以使用别名。因此,您可以尝试将对距离别名的检查移动到HAVING
子句:
WHERE
vac.subdomain = :subdomain AND
vac.company_latitude IS NOT NULL AND
vac.company_longitude IS NOT NULL
HAVING
distance < :distance;
在哪里
vac.subdomain=:子域和
vac.company_纬度不为空且
vac.U经度不为空
有
距离<:距离;
如果出于某种原因您不喜欢这种方法,那么另一种方法可能是在
WHERE
子句中重复distance
的整个表达式。它有效!我把HAVING子句放在WHERE子句之前,但把它放在WHERE子句之后就行了!谢谢@昨天你能把这个答案标对吗?答案左边的绿色复选标记。它有效!我把HAVING子句放在WHERE子句之前,但把它放在WHERE子句之后就行了!谢谢@昨天你能把这个答案标对吗?答案左边的绿色复选标记。
WHERE
vac.subdomain = :subdomain AND
vac.company_latitude IS NOT NULL AND
vac.company_longitude IS NOT NULL
HAVING
distance < :distance;