2011-06-19 13 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'を持ちます。 '

私の質問は、座標を持たないレコードも返すのですか?座標= '0'の場合、距離計算プロセスをバイパスするにはどうすればいいですか?

答えて

2

セクション「を有する」に別の句を追加します。私は間違っているかもしれませんが、私は「緯度がNULLではありません」または「経度がNULLでないかどうかを確認するクエリのいずれかの条件が表示されない

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

それは多くのおかげでおかげで働いた – william

0

を"または" coordinates = '1' "となります。つまり、クエリでは、座標を持つレコードまたは座標を持たないすべてのレコードを返す必要があります。後者の場合、SELECT出力には 'latitude'、 '経度'、 'distance'フィールドに値はありません。

私はとにかくNULLを返しますので、あなたが「座標= 0」の距離の計算をバイパスする必要はありませんと思いますが、あなたがしたい場合は、以下のように、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 
... 
...