MySQL仅当同时选择最新位置时才选择最近的位置

MySQL仅当同时选择最新位置时才选择最近的位置,mysql,sql,Mysql,Sql,假设我有3张这样的桌子: cities ------ name latitude longitude stalls ------ id name locations --------- stall_id latitude longitude date 我想在过去6个月内找到离城市最近的摊位。这部分很好-我查询了stalls/locations表,并使用Haversine到达距离之内。一切都好 这是我当前的查询: SELECT stalls.name, ( 3959 * acos( cos(

假设我有3张这样的桌子:

cities
------
name
latitude
longitude

stalls
------
id
name

locations
---------
stall_id
latitude
longitude
date
我想在过去6个月内找到离城市最近的摊位。这部分很好-我查询了stalls/locations表,并使用Haversine到达距离之内。一切都好

这是我当前的查询:

SELECT stalls.name, ( 3959 * acos( cos( radians($lat) ) * cos( radians( locations.lat ) ) * cos( radians( locations.lng ) - radians($lng) ) + sin( radians($lat) ) * sin(radians(locations.lat)) ) ) AS distance
FROM locations
LEFT JOIN stalls ON stalls.id = locations.trader_id
WHERE locations.added > $date
HAVING distance < 10
选择stalls.name,(3959*acos(弧度($lat))*cos(弧度(locations.lat))*cos(弧度(locations.lng)-弧度($lng))+sin(弧度($lat))*sin(弧度(locations.lat)))作为距离
从地点
左连接stalls.id=locations.trader\u id上的stalls
WHERE locations.added>$date
距离小于10的
但是,一个摊位可能在不同的城市有多个新位置,我只想在最新位置上与一个城市匹配。 e、 g.一个摊位可能与纽约最近的摊位相匹配,但随后为洛杉矶增加了一个新的位置。现在它应该只在洛杉矶展出6个月,而不是在纽约——至少在另一个地点被增加之前。以前的位置需要存储,所以我不能只清除这些位置


在查询中执行此操作的最佳方法是什么?

要获取每个失速的最新位置,请执行以下操作:

select l.*
from locations l
where l.date = (select max(l2.date) from locations l2 where l2.stall_id = l.stall_id);

我不确定这是否适合您的整体查询。

您应该显示您的查询。我已经添加了查询See:所以我想我可以在子查询中执行类似的操作,但这是否一定是最好/最有效的方法?@Wazzbast。有很多方法可以做到这一点。在
位置(摊位id、日期)
上有索引,这应该具有很强的竞争力。