mysql中具有最小距离的分组方式
我被这个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 ) )
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
策略,它首先获取一个表,其中只包含hotelname\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我让伙计们找到答案!这里的讨论不是关于图片或文字这是一个伟大的问题!以下是一个讨论可能解决方案的策略的博客: