ホームページ >バックエンド開発 >PHPチュートリアル >Mysql ストアド プロシージャ - 半径内の資格のあるユーザーをクエリし、Baidu 座標を介して距離を並べ替えます

Mysql ストアド プロシージャ - 半径内の資格のあるユーザーをクエリし、Baidu 座標を介して距離を並べ替えます

WBOY
WBOYオリジナル
2016-08-08 09:31:361048ブラウズ

以前似たようなアプリケーションを作ったことがありますが、今日見てみたらあまり合理的ではないと感じたので、考え直してクエリストアドプロシージャを作成しました。

テーブルは次のとおりですkm);

@_data、受け入れて戻ります

戻り値の di は、近いものから遠いものまでソートされた距離であり、単位は m です。

ストアド プロシージャを使用しない場合は、それを PHP プログラムに分割できます:

-- ----------------------------
-- 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 チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。