mysql - SQL ORDER BY 距离无法正常工作

标签 mysql sql google-maps geolocation

对于我页面上的结果,我需要按距离对结果进行排序。该页面获取用户的当前位置并检索该位置最接近的 30 个结果。

除了距离顺序之外,我还想按价格对每个 field 的结果进行排序。

问题是价格顺序有效,但距离顺序无效。我无法弄清楚我的函数如何对结果进行排序,因为它没有结构(有时最接近的结果在最后一个位置,有时在中间,有时在开头,这真的很奇怪)。

我的 SQL 语句如下所示:

$lat = '48.213688';
$lng = '16.408229';

$sql = "SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(venue_address_lat)) * cos(radians(venue_address_lng) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(venue_address_lat)))) AS distance 
FROM car_offer JOIN venues_infos ON car_offer.venues_infos_id = venues_infos.venue_id WHERE (3959 * acos(cos(radians('".$lat."')) * cos(radians(venue_address_lat)) * cos(radians(venue_address_lng) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(venue_address_lat)))) < 1.5
AND car_offer.offer_date = CURDATE()
AND venue_address_postcode = 1020
OR car_offer.offer_date = '0000-00-00'
ORDER BY distance, offer_price_small LIMIT 0,30";

数据库中的 lat, lng 来自 Google map ,因此这应该是准确的。

最佳答案

我认为在这种情况下你最好使用外部查询,然后执行 order by在外部查询中,如下所示。 (或者)您可以使用相同的 distance order by 中的计算表达式。请注意,我已移动 distance < 1.5从内部查询到外部查询。而且,我怀疑你是否可以使用distance在你的order by子句就像您使用的方式一样(意味着在同一查询级别,除非它来自派生表表达式),因为 distance是列别名。

SELECT * FROM
(
SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(venue_address_lat)) * cos(radians(venue_address_lng) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(venue_address_lat)))) AS distance 
FROM car_offer 
JOIN venues_infos 
ON car_offer.venues_infos_id = venues_infos.venue_id 
WHERE car_offer.offer_date = CURDATE()
AND venue_address_postcode = 1020
OR car_offer.offer_date = '0000-00-00'
) tab
WHERE distance < 1.5
ORDER BY distance, offer_price_small 
LIMIT 0,30

关于mysql - SQL ORDER BY 距离无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725870/

相关文章:

mysql - 查询设置货币mysql

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - sql查询将天数添加到特定列日期

android - 使用系统毫秒循环一个 Action android java

javascript - 如果我知道纬度和经度,谷歌地图如何添加标记

MySQL:将信息从表复制到具有相反值的另一个表

MYSQL - 存储过程和准备好的语句处理引号

mysql - F# 连接到在线 MySQL DB 执行查询

sql - 从两个没有关系的表中选择

javascript - 谷歌地图只显示一个点