ホームページ >バックエンド開発 >PHPチュートリアル >Mysql ストアド プロシージャ - 半径内の資格のあるユーザーをクエリし、Baidu 座標を介して距離を並べ替えます
以前似たようなアプリケーションを作ったことがありますが、今日見てみたらあまり合理的ではないと感じたので、考え直してクエリストアドプロシージャを作成しました。
テーブルは次のとおりですkm);
@_data、受け入れて戻ります
戻り値の di は、近いものから遠いものまでソートされた距離であり、単位は m です。
-- ---------------------------- -- Procedure structure for DIS -- ---------------------------- DROP PROCEDURE IF EXISTS `DIS`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `DIS`(IN `_lat` varchar(11),IN `_lng` varchar(11),IN `_ras` int,INOUT `_data` text) BEGIN DECLARE _sql text ; DECLARE EARTH_RADIUS VARCHAR(10) ; DECLARE _range VARCHAR(16); DECLARE lngR VARCHAR(16); DECLARE maxLat VARCHAR(16); DECLARE minLat VARCHAR(16); DECLARE maxLng VARCHAR(16); DECLARE minLng VARCHAR(16); SET EARTH_RADIUS = 6378.137; SET _range = 180 / pi() * _ras / EARTH_RADIUS; SET lngR = _range / cos(_lat * pi() / 180); SET maxLat = _lat + _range; SET minLat = _lat - _range; SET maxLng = _lng + lngR ; SET minLng = _lng - lngR ; SET @_sql = CONCAT('SELECT *, ceil( 2 * asin( sqrt( pow(sin((((',_lat,' * PI() / 180.0) - (',_lat,' * PI() / 180.0))) / 2),2) + cos(',_lat,' * PI() / 180.0) * cos(lat * PI() / 180.0) * pow(sin(((',_lng,' * PI() / 180.0) - (lng * PI() / 180.0)) / 2),2) ) ) * ',EARTH_RADIUS,' * 1000 ) AS di FROM dis WHERE lat BETWEEN ',minLat,' AND ',maxLat,' AND lng BETWEEN ',minLng,' AND ',maxLng,' ORDER BY di LIMIT 0,10'); PREPARE stmt FROM @_sql; EXECUTE stmt; END ;; DELIMITER ;
まず正方形の座標領域を取得し、それを上記の @_sql の SQL を介して SQL ステートメントに結合し、実行します。 。
注意: ここで得られる結果は円形の半径ではなく正方形です。array_filter() など、後の段階で二次フィルタリングを実行できますが、これについてはここでは詳しく説明しません。
上記は、Mysql ストアド プロシージャを紹介しています。Baidu 座標を使用して、ソート後の半径と距離内にある資格のあるユーザーをクエリします。内容の側面も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。