我有以下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),但这也不起作用。
有人有主意吗?
提前谢谢!
1条答案
按热度按时间v9tzhpje1#
在mysql(或大多数其他数据库)中,不可能重用在数据库中定义的别名
SELECT
合同条款WHERE
条款。这与当时别名还不可用有关WHERE
对子句进行求值。mysql有一个方便的特性,那就是重载
HAVING
运算符,可以像WHERE
条款。还有,这个HAVING
运算符可以使用别名。因此,可以尝试将距离别名上的检查移动到HAVING
条款:如果出于某种原因,您不喜欢这种方法,那么另一种方法可能是重复整个表达式
distance
在WHERE
条款。