从数据库中获取 lat/lng 点的距离
get distance of lat/lng point from database
我有以下 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.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
这会获取地址周围的所有空缺职位。
当我删除以下行时有效:
AND
distance < :distance
但是当我添加这段代码时,它不起作用。但我想设置一个最大值。距离.
PHP:
$stmtSelectVacancies = $db->prepare($querySelectVacancies);
$stmtSelectVacancies->bindParam(':latitude', $latitude);
$stmtSelectVacancies->bindParam(':longitude', $longitude);
$stmtSelectVacancies->bindParam(':subdomain', $subdomain);
$stmtSelectVacancies->bindParam(':distance', $distance);
$stmtSelectVacancies->execute();
// and so on...
我还在 WHERE 子句之前尝试了 HAVING 子句(HAVING 距离 < :distance),但这也不起作用。
有人有想法吗?
提前致谢!
在 MySQL(或大多数其他数据库)中不可能在 WHERE
子句中重用 SELECT
子句中定义的别名。这与评估 WHERE
子句时别名尚不可用有关。
MySQL 有一个方便的功能,它是重载的 HAVING
运算符,可以像 WHERE
子句一样使用。此外,此 HAVING
运算符 可以 使用别名。因此,您可以尝试将对距离别名的检查移动到 HAVING
子句:
WHERE
vac.subdomain = :subdomain AND
vac.company_latitude IS NOT NULL AND
vac.company_longitude IS NOT NULL
HAVING
distance < :distance;
如果由于某种原因您不喜欢这种方法,那么替代方法可能是在 WHERE
子句中重复 distance
的整个表达式。
我有以下 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.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
这会获取地址周围的所有空缺职位。
当我删除以下行时有效:
AND
distance < :distance
但是当我添加这段代码时,它不起作用。但我想设置一个最大值。距离.
PHP:
$stmtSelectVacancies = $db->prepare($querySelectVacancies);
$stmtSelectVacancies->bindParam(':latitude', $latitude);
$stmtSelectVacancies->bindParam(':longitude', $longitude);
$stmtSelectVacancies->bindParam(':subdomain', $subdomain);
$stmtSelectVacancies->bindParam(':distance', $distance);
$stmtSelectVacancies->execute();
// and so on...
我还在 WHERE 子句之前尝试了 HAVING 子句(HAVING 距离 < :distance),但这也不起作用。
有人有想法吗?
提前致谢!
在 MySQL(或大多数其他数据库)中不可能在 WHERE
子句中重用 SELECT
子句中定义的别名。这与评估 WHERE
子句时别名尚不可用有关。
MySQL 有一个方便的功能,它是重载的 HAVING
运算符,可以像 WHERE
子句一样使用。此外,此 HAVING
运算符 可以 使用别名。因此,您可以尝试将对距离别名的检查移动到 HAVING
子句:
WHERE
vac.subdomain = :subdomain AND
vac.company_latitude IS NOT NULL AND
vac.company_longitude IS NOT NULL
HAVING
distance < :distance;
如果由于某种原因您不喜欢这种方法,那么替代方法可能是在 WHERE
子句中重复 distance
的整个表达式。