从数据库获取lat/lng点的距离

kxe2p93d  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(428)

我有以下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<:distance),但这也不起作用。
有人有主意吗?
提前谢谢!

v9tzhpje

v9tzhpje1#

在mysql(或大多数其他数据库)中,不可能重用在数据库中定义的别名 SELECT 合同条款 WHERE 条款。这与当时别名还不可用有关 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;

如果出于某种原因,您不喜欢这种方法,那么另一种方法可能是重复整个表达式 distanceWHERE 条款。

相关问题