2014-05-09 56 views
1

我正在做一個按位置選擇事物的查詢 - 我需要以查詢過程中檢查產品是否在距離用戶位置2英里半徑的方式進行選擇,問題在於檢查是在另一個PHP函數中,並且盡我所知我無法在查詢結束之前使用param從數據庫調用php函數。在mysql查詢中使用php函數

感謝

需要使用的功能:

public static function vincentyGreatCircleDistance(
     $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000) 
    { 
     // convert from degrees to radians 
     $latFrom = deg2rad($latitudeFrom); 
     $lonFrom = deg2rad($longitudeFrom); 
     $latTo = deg2rad($latitudeTo); 
     $lonTo = deg2rad($longitudeTo); 

     $lonDelta = $lonTo - $lonFrom; 
     $a = pow(cos($latTo) * sin($lonDelta), 2) + 
     pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2); 
     $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta); 

     $angle = atan2(sqrt($a), $b); 
     return $angle * $earthRadius; 
    } 

我的查詢(無位置):

SELECT * FROM `products` WHERE `name` LIKE '%iphone%' OR `name` LIKE '%5s%' 

我想做

SELECT * FROM `products` WHERE `name` LIKE '%iphone%' OR `name` LIKE '%5s%' AND vincentyGreatCircleDistance($lat, $long, `lat`,`long`) < 2 
什麼

謝謝

+1

這是不可能使用PHP方法內查詢一樣, –

回答

0

您可能正在尋找存儲過程 - 請參閱MySQL manual關於如何將函數轉換爲MySQL過程的信息。

+0

你能解釋一下請如何使我的PHP函數,存儲過程? – Itay

+0

嘿,Itay,今天我不會在這裏呆過,但是如果你還沒有找到解決方案,我會盡力爲你改寫。 – dAngelov

0

可能有兩種可能的方式,我建議:


1)嘗試看看,如果你能PHP函數轉換爲MySQL存儲功能。 MySQL有自己的數學運算庫。一旦你有相同的存儲函數,你可以直接調用它,就像調用任何其他MySQL系統函數(甚至在WHERE子句中進行比較)一樣。它可以像其他任何列一樣處理。


2)如果你不能夠轉換你的PHP函數,
你可以使用tmp表格。
事情是這樣的:

  • CREATE TEMPORARY TABLE tmp目錄AS SELECT * FROM products WHERE name LIKE '%iphone%' 或name LIKE '%5S%';
  • ALTER TABLE tmp ADD COLUMN vincentyGreatCircleDistance DOUBLE;
  • LOOP通過TMP結果集
while(tmp_resultset->row()){ 
     $r_lat=row->lat; 
     $r_long=row->long; 
     $vincentyGreatCircleDistance=vincentyGreatCircleDistance($lat, $long, $r_lat, $r_long); 
     query_object("UPDATE SET vincentyGreatCircleDistance=IF(".$vincentyGreatCircleDistance.",".$vincentyGreatCircleDistance.",0) WHERE id=".row->id; 
    } 
  • SELECT * FROM TMP;

希望這有助於:)