Mysql 帮你解决问题不要麻烦做两次PK。你的建议是正确的,即使不是100%充分,但你让我找到了解决问题的正确方法,这就是为什么我给了你一个当之无愧的+1。问题是我真的不需要距离,只需要知道距离是否在一定水平以上。因此,我在下面的回答中修改了查询。你的建议是正确的,

Mysql 帮你解决问题不要麻烦做两次PK。你的建议是正确的,即使不是100%充分,但你让我找到了解决问题的正确方法,这就是为什么我给了你一个当之无愧的+1。问题是我真的不需要距离,只需要知道距离是否在一定水平以上。因此,我在下面的回答中修改了查询。你的建议是正确的,,mysql,indexing,latitude-longitude,query-performance,Mysql,Indexing,Latitude Longitude,Query Performance,帮你解决问题不要麻烦做两次PK。你的建议是正确的,即使不是100%充分,但你让我找到了解决问题的正确方法,这就是为什么我给了你一个当之无愧的+1。问题是我真的不需要距离,只需要知道距离是否在一定水平以上。因此,我在下面的回答中修改了查询。你的建议是正确的,即使不是100%充分,但你让我找到了解决问题的正确方法,这就是为什么我给了你一个当之无愧的+1。问题是我真的不需要距离,只需要知道距离是否在一定水平以上。因此,我在下面的回答中修改了查询。祝贺你!你在的链接真的关注我的问题!事实上,我的解决方案


帮你解决问题不要麻烦做两次PK。你的建议是正确的,即使不是100%充分,但你让我找到了解决问题的正确方法,这就是为什么我给了你一个当之无愧的+1。问题是我真的不需要距离,只需要知道距离是否在一定水平以上。因此,我在下面的回答中修改了查询。你的建议是正确的,即使不是100%充分,但你让我找到了解决问题的正确方法,这就是为什么我给了你一个当之无愧的+1。问题是我真的不需要距离,只需要知道距离是否在一定水平以上。因此,我在下面的回答中修改了查询。祝贺你!你在的链接真的关注我的问题!事实上,我的解决方案(在您的建议之前开发)与实现“边界框”的方向相同,但没有分区。真的很有用,做得很好的网页!非常感谢!祝贺你在的链接真的关注我的问题!事实上,我的解决方案(在您的建议之前开发)与实现“边界框”的方向相同,但没有分区。真的很有用,做得很好的网页!非常感谢!又名“包围盒”。需要一个纬度的余弦来解释比纬度更近的经线。又名“边界框”。需要一个纬度的余弦来说明经线比纬度更接近。
CREATE TABLE `data_addresses` (
    `ID` int(11) NOT NULL COMMENT 'Primary Key',
    `LAT` int(11) NOT NULL COMMENT 'Latitude x 10000',
    `LNG` int(11) NOT NULL COMMENT 'Longitude x 10000',
    `ADDRESS` varchar(128) NOT NULL COMMENT 'Reverse Geocoded Street Address'
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
ALTER TABLE `data_addresses`
    ADD PRIMARY KEY (`ID`),
    ADD UNIQUE KEY `IDX_ADDRESS_UNIQUE_LATLNG` (`LAT`,`LNG`),
    ADD KEY `IDX_ADDRESS_LAT` (`LAT`),
    ADD KEY `IDX_ADDRESS_LNG` (`LNG`);
ALTER TABLE `data_addresses`
    MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key';
SELECT `id`, ROUND(SQRT(POW(ABS(`LAT`-ROUND(MyLat*10000)),2)+POW(ABS(`LNG`-ROUND(MyLon*10000)),2))) AS R FROM splc_smarttrk.`data_addresses` ORDER BY R ASC LIMIT 1
SELECT 
   id 
 , ROUND(SQRT(POW(ABS(`LAT`-ROUND([LAT]*10000)),2)+POW(ABS(`LNG`- ROUND([LNG]*10000)),2))) AS R

FROM ( 

  SELECT 
   LAT 
  FROM  
   data_addresses
  WHERE 
   LAT <= [LAT]  
  ORDER BY
   LAT DESC
  LIMIT 100

  UNION ALL

  SELECT 
   LAT   
  FROM 
   data_addresses
  WHERE 
   LAT >= [LAT]
  ORDER BY
   LAT ASC
  LIMIT 100

  SELECT 
   LNG 
  FROM 
   data_addresses
  WHERE 
   LNG <= [LNG]
  ORDER BY
   LNG DESC
  LIMIT 100

  UNION ALL

  SELECT 
   LNG
  FROM 
   data_addresses
  WHERE 
   LNG >= [LNG]
  ORDER BY
   LNG ASC
  LIMIT 100
) 
 AS data_addresses_range
ORDER BY 
 R ASC
LIMIT 1
SELECT  `id` AS ID,
ROUND(SQRT(POW(ABS(`LAT`-ROUND(NLat*10000)), 2) +
           POW(ABS(`LNG`-ROUND(NLon*10000)), 2))
     ) AS RT INTO  ADDR_ID, RATING
    FROM  splc_smarttrk.`data_addresses`
    WHERE  (`LAT` BETWEEN (ROUND(NLat*10000)-R) AND (ROUND(NLat*10000)+R))
      AND  (`LNG` BETWEEN (ROUND(NLon*10000)-R) AND (ROUND(NLon*10000)+R))
    ORDER BY  RT ASC
    LIMIT  1;