【问题标题】:get distance of lat/lng point from database从数据库中获取 lat/lng 点的距离
【发布时间】:2018-07-18 14:20:35
【问题描述】:

我有以下 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 距离

谁有想法?

提前致谢!

【问题讨论】:

    标签: php mysql geolocation


    【解决方案1】:

    在 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 的整个表达式。

    【讨论】:

    • 它有效!我在 WHERE 子句之前有 HAVING 子句,但把它放在它之后!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多