分组在mysql中具有最小距离

时间:2015-02-28 09:30:43

标签: mysql google-maps-api-3 distance

我遇到了这个mysql查询

SELECT hotels.radius,
hotels.hotel_id,
hotel_names.name_id,
hotel_names.image,
hotel_names.name,
hotel_names.description, 
hotels.hotel_address,hotels.lat,hotels.lng, 
( 6371 * acos( cos( radians( 45.4046728 ) ) * cos( radians( lat ) ) * 
cos( radians( lng ) - radians( 11.8485039 ) ) + 
sin( radians( 45.4046728 ) ) * sin( radians( lat ) ) ) ) AS distance 
FROM hotels 
INNER JOIN hotel_names 
ON hotels.name_id = hotel_names.name_id 
ORDER BY `distance` ASC

此查询的结果 results page

预期结果应该是最小距离 name_id 的GROUP BY,并标记为黄色

expected result

检查此http://gyazo.com/18b705b042e289d5d0a2dc9adde4c715,预期结果应为酒店ids 17,23,26,28,25 谢谢

1 个答案:

答案 0 :(得分:1)

这是您的查询,这无疑是详细的:

SELECT y.radius,y.hotel_id,y.name_id,y.image,y.name,y.description, y.hotel_address,y.lat,hotels.lng,y.distance
FROM (
    SELECT hotels.name_id, min( 6371 * acos( cos( radians( 45.4046728 ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians( 11.8485039 ) ) + sin( radians( 45.4046728 ) ) * sin( radians( lat ) ) ) ) AS mindistance FROM hotels INNER JOIN hotel_names ON hotels.name_id = hotel_names.name_id GROUP BY hotels.name_id
) AS x
INNER JOIN (
    SELECT hotels.radius,hotels.hotel_id,hotel_names.name_id,hotel_names.image,hotel_names.name,hotel_names.description, hotels.hotel_address,hotels.lat,hotels.lng, ( 6371 * acos( cos( radians( 45.4046728 ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians( 11.8485039 ) ) + sin( radians( 45.4046728 ) ) * sin( radians( lat ) ) ) ) AS distance
    FROM hotels INNER JOIN hotel_names
    ON hotels.name_id = hotel_names.name_id
) AS y
ON y.name_id = x.name_id AND y.distance = x.mindistance;

我使用了self-join策略,该策略首先获得的表格中除了酒店name_id组以外的任何内容以及我命名为mindistance的变量,这是与您的硬件的最小距离编码位置,适用于每个组。在上面的查询中,此中间表称为x,如果您将其作为单独的查询运行,它将看起来像这样:

--------------------------------
| name_id |    mindistance     |
--------------------------------
|    1    | 4.932831427954488  |
|    2    | 2.7469817798115566 |
|    4    | 6.677055216749393  |
|    5    | 4.359018738728522  |
|    6    | 4.6047991286091055 |
--------------------------------

然后,我将此表格重新加入到您上述问题中原始INNER JOIN查询结果的表格中。请注意,此ON的{​​{1}}条件仅匹配每INNER JOIN个记录,该记录在该组中也具有最小距离。我没有对结果进行排序,但我欢迎您尝试此查询,并告诉我们它是否适合您。

经过进一步的反思,这个问题可以通过一些简化来简化。如果您的初始结果只有一个表可以帮助。此外,如果您创建了一个专用列,其中包含的距离也会使事情更容易阅读。