2011-06-19 49 views
0

嗯,我有這個疑問有條件的PHP和MySQL查詢

$query = sprintf("SELECT price, 
         address, 
         state, 
         thumbnail, 
         name, 
         provider, 
         category, 
         latitude, 
         longitude, 
         (6371 * acos(cos(radians('%s')) * cos(radians(latitude)) * cos(radians(longitude) - radians('%s')) + sin(radians('%s')) * sin(radians(latitude)))) AS distance 
        FROM records 
        WHERE category IN ("1,2,3") 
        AND active = '1' 
        HAVING distance < '%s' 
       ORDER BY distance", 
mysql_real_escape_string($center_lat), 
mysql_real_escape_string($center_lng), 
mysql_real_escape_string($center_lat), 
mysql_real_escape_string($radius)); 

它基本上抓住從表中交易的座標並計算這些點與用戶輸入的座標($ center_lat,LNG)之間的距離。然後根據距離對它進行排序。

數據庫中的某些記錄沒有經度和緯度,因此將不會返回,並且沒有座標的記錄的座標='0',其中具有座標的記錄的座標='1 」。

我的問題是如果我還想返回沒有座標的記錄?如果座標='0',如何繞過距離計算過程。

回答

2

增加一個條款,該「具有」節:

SELECT ... 
HAVING ((distance < 1) or (coordinates = 0)) AND $price 
... 
+0

這非常有用,非常感謝 – william

0

我可能是錯的,但我沒有看到在您的查詢,檢查任何條件,如果「緯度IS NOT NULL」或「經度IS NOT NULL 「或」座標='1'「。這意味着你的查詢應該返回所有有座標或沒有座標的記錄。對於後者,當然SELECT輸出在「緯度」,「經度」和「距離」字段中不會有任何值。

我覺得你並不需要繞行的距離計算爲「座標= 0」,因爲這將反正返回NULL,但如果你願意,你可以使用CASE功能做到這一點,象下面這樣:

SELECT price, 
address, 
state, 
thumbnail, 
name, 
provider, 
category, 
latitude, 
longitude, 
(
CASE 
WHEN coordinates = '1' 
THEN (6371 * 
    acos( 
    cos(radians('%s')) * 
    cos(radians(latitude)) * 
    cos(radians(longitude) - radians('%s')) + 
    sin(radians('%s')) * 
    sin(radians(latitude)) 
    )) 
ELSE 0 
) AS distance 
FROM records 
... 
...