現在有這樣的需求,我要根據當前地點的經緯度,在數據表中查詢附近兩公里的五個地點,如果查詢的結果沒有五個地點我要擴大附近的範圍,直到查詢到五個地點位置。我想到了兩個方案:
第一種方案是完全用sql語句實現,如果完全用sql語句實現,我不知道這個sql怎麼寫,
第二種方案是先查詢,然後在業務成進行判斷,如果不滿足5個地點,在進行擴大附近範圍,再次在數據庫裡查詢,直到查詢到5個地點。
我不知道這兩種方案那個效率高,請大家給點建議。感激不盡。
現在有這樣的需求,我要根據當前地點的經緯度,在數據表中查詢附近兩公里的五個地點,如果查詢的結果沒有五個地點我要擴大附近的範圍,直到查詢到五個地點位置。我想到了兩個方案:
第一種方案是完全用sql語句實現,如果完全用sql語句實現,我不知道這個sql怎麼寫,
第二種方案是先查詢,然後在業務成進行判斷,如果不滿足5個地點,在進行擴大附近範圍,再次在數據庫裡查詢,直到查詢到5個地點。
我不知道這兩種方案那個效率高,請大家給點建議。感激不盡。
完全看不懂你兩種方案。
你就不能先簡化你的邏輯嗎?
你的要求不就是等於:查詢最近的五個地點。 為什麼還要分兩公里內還是兩公里外。
如果查詢最近的五個點,那為什麼還要考慮什麼業務判斷呢,直接SQL一個Limit不就行了嗎?
第二種方案可行,完全用sql去實現,對資料庫的壓力較大,資料層和業務層分開執行效率要高
你需要高德LBS雲,他會滿足你的需求的
試下mysql的空間座標資料庫,
<code>CREATE TABLE `spa` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `loc` point DEFAULT NULL, /* ^---------------------------------- 保存经纬度 */ PRIMARY KEY (`id`) )</code>
<code>/* 查询 */ SELECT * FROM spa WHERE DISTANCE(POINT($当前经度, $当前纬度), loc) < ($距离(单位米) / 111195) LIMIT 5; /* ^-----单位为度 ^---1度多少米 */</code>
如果要排序, 可以把distance order一下.
你需要使用GEOHASH將二維座標變成字串,然後再比較