Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中具有最小距离的分组方式_Mysql_Google Maps Api 3_Distance - Fatal编程技术网

mysql中具有最小距离的分组方式

mysql中具有最小距离的分组方式,mysql,google-maps-api-3,distance,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 ) )

我被这个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
此查询的结果

预期结果应为最小距离,且 按名称\u id分组,并标记为黄色

勾选此项,预期结果应为酒店ID 17、23、26、28、25
谢谢

这是您的问题,诚然是冗长的:

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
策略,它首先获取一个表,其中只包含hotel
name\u id
组和一个我命名的变量
mindistance
,它是每个组与硬编码位置的最小距离。在上面的查询中,这个中间表被称为
x
,如果您将它作为一个单独的查询运行,它看起来会像这样:

--------------------------------
| name_id |    mindistance     |
--------------------------------
|    1    | 4.932831427954488  |
|    2    | 2.7469817798115566 |
|    4    | 6.677055216749393  |
|    5    | 4.359018738728522  |
|    6    | 4.6047991286091055 |
--------------------------------
然后,我将这个表连接回您在上面的问题中原始的
内部连接
查询得到的表。请注意,此
内部联接的
ON
条件只匹配每个
name\u id
的一条记录,该记录在该组中也具有最小距离。我没有对结果进行排序,但我欢迎您尝试此查询,并让我们知道它是否适合您


经过进一步思考,这个查询可以通过一些事情简化。如果你的初始结果只有一张表,那会有所帮助。此外,如果您创建了一个包含距离的专用列,也会使内容更易于阅读。

编辑您的问题,并将答案和预期答案以文本形式而不是图片形式发布。@Rahul检查此项,预期结果应为酒店ID 17、23、26、28,25@SamArulRaj嗯,那还是一张照片。提供适当的DDL和/或sqlfiddle@Strawberry我让伙计们找到答案!这里的讨论不是关于图片或文字这是一个伟大的问题!以下是一个讨论可能解决方案的策略的博客: