SQL ORDER BY distance 无法正常工作

Posted

技术标签:

【中文标题】SQL ORDER BY distance 无法正常工作【英文标题】:SQL ORDER BY distance not working properly 【发布时间】:2014-07-13 18:26:32 【问题描述】:

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

在距离顺序旁边,我还想按价格对每个venue 的结果进行排序。

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

我的 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来自谷歌地图,所以应该是准确的。

【问题讨论】:

什么没有解决这个问题?您收到错误消息了吗? 没有。我得到一个结果列表,但列表的顺序不是按距离,顺序是别的(顺序中没有结构) 来自***.com/questions/13231167/… 我原以为您会在这里收到错误 1054 - 您在查询的一个表中是否有一个名为 distance 的列? 不,我没有。我将查询中的公式命名为“距离” 出于兴趣,是不是别名导致了问题?即,如果您在 ORDER BY 子句中重复包含别名的表达式而不是使用别名,您会得到预期的结果吗? 【参考方案1】:

我认为您最好在这种情况下使用外部查询,然后在外部查询中执行order by,如下所示。 (OR) 您可以在 order by 中使用相同的 distance 计算表达式。请注意,我已将 distance &lt; 1.5 从内部查询移至外部查询。此外,我怀疑您是否可以像您使用的方式一样在您的order by 子句中使用distance(意味着在同一查询级别,除非它来自派生表表达式),因为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

【讨论】:

我认为你最好在order by 中使用相同的distance 计算表达式(或者只使用HAVING

以上是关于SQL ORDER BY distance 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

order_by('distance') 没有按预期工作

mysql 多表 查询 之后 group by 分组 order by 无法按照日期排序

若SQL语句中的ORDER BY短语中指定了多个字段,则( )。

web安全SQL注入中order by后无法参数化

SQL Server MERGE 语句和 ORDER BY 子句

sql注入中order by的作用