mysql 實現經緯度排序查找功能


需求如下:

商品有多個門店,用戶使用App時需要查找附近門店的商品,商品要進行去重分頁。

思路:

1.確認mysql自帶經緯度查詢函數可以使用。

2.該需求需要利用分組排序,取每個商品最近門店的商品id,之后關聯商品表獲取商品信息即可。

3.mysql還是有很多限制。10w級數據處理時性能沒問題,200ms以下可以接受。后續考慮使用其他方案代替

 

表結構

-- 建表
CREATE TABLE `store` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `item_id` bigint(20) NOT NULL DEFAULT '0',
  `longitude` double(50,6) NOT NULL COMMENT '經度',
  `latitude` double(50,6) NOT NULL COMMENT '緯度',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

-- 寫入數據
INSERT INTO `store` (`id`, `name`, `item_id`, `longitude`, `latitude`)
VALUES
    (3, '歐美金融城_星爸爸', 1, 120.011496, 30.287637),
    (4, '永樂城_星爸爸', 1, 120.011802, 30.280433),
    (5, '小鎮_一鳴', 2, 120.011209, 30.298552),
    (6, '賽銀國際', 2, 120.027181, 30.280808),
    (7, '合景天峻_星爸爸', 1, 120.004597, 30.291660),
    (8, '倉溢東苑_星爸爸', 1, 120.008622, 30.292783);

 

存儲過程模擬10w數據

DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `insert_store`()
begin 
    DECLARE v_i int unsigned DEFAULT 0;
    WHILE v_i < 100000 DO
        INSERT INTO `store` ( `name`, `item_id`, `longitude`, `latitude`, `distance`)
        VALUES     ( concat('合景天峻_星爸爸' , round(RAND() * 10000)) , RAND() * 1000, 120 + round(RAND(),6), 30 + round(RAND(),6), 0);
        SET v_i = v_i+1;
    END WHILE;
end;;
DELIMITER ;

 

 分頁10條,查詢5公里內門店權益id

1.mysql5.7.5使用st_distance_sphere函數計算距離。 

2.若出現sql_mode=only_full_group_by錯誤請參考下面鏈接4

select shop.* 
from
(
select * ,round(st_distance_sphere(point(120.012484,30.298926),point(`longitude`,`latitude`))) dis
 from test111.store 
having dis < 5000
 order by dis limit 100000 ) shop
group by shop.item_id
order by dis
limit 10

 

查詢結果如圖 - 查詢離我最近的門店商品。按商品分頁

 

 

 

 

 

參考 https://www.cnblogs.com/hdwang/p/9994153.html

使用到的工具和遇到的問題

1.經緯度測試 http://tool.yovisun.com/longlat/index.php?long1=30.298926&lat1=120.012484&long2=30.292783&lat2=120.008622

2.mysql存儲過程用於寫入數據 https://www.cnblogs.com/jiangxiaobo/p/9214349.html

3.mysql分組排序去最新一條 https://blog.csdn.net/cz596738622/article/details/80253999

4.sql_mode=only_full_group_by錯誤參考處理 https://www.cnblogs.com/jpfss/p/10401753.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM