0

データベースから会社を選択し(lat / lngが保存されている)、顧客の場所に最も近い5つの場所を表示する次のSQLステートメントがあります。これは完全に機能しています:

$ query = sprintf( "SELECT company_name、address、telephone、fax、contact_email、website、url、latitude、longitude、(1.609344 * 3959 * acos(cos(radians('"。$center_lat。"'))* cos(radians (緯度))* cos(radians(経度)-radians('"。$center_lng。"'))+ sin(radians('"。$center_lat。"'))* sin(radians(緯度)))))AS距離FROMcmsms_module_compdir_companiesWHERE status ='published' AND Latitude!='' ANDlongitude!='' ORDER BY distance limit 5 "、
mysql_real_escape_string($ center_lat)、
mysql_real_escape_string($ center_lng)、
mysql_real_escape_string($ center_lat));

ただし、結果を顧客の場所からX距離以内(たとえば50 km)の店舗のみに制限したいと思います。以下に太字でビットを追加できると思いました:

$ query = sprintf( "SELECT company_name、address、telephone、fax、contact_email、website、url、latitude、longitude、(1.609344 * 3959 * acos(cos(radians('"。$center_lat。"'))* cos(radians (緯度))* cos(radians(経度)-radians('"。$center_lng。"'))+ sin(radians('"。$center_lat。"'))* sin(radians(緯度)))))AS距離FROMcmsms_module_compdir_companiesWHERE status ='published' AND Latitude!='' ANDlongitude!='' AND distance <'50' ORDER BY distance limit 5 "、mysql_real_escape_string($ center_lat)、
mysql_real_escape_string($ center_lng)、
mysql_real_escape_string($ center_lat ));

...しかし、これは結果をまったく返しません。

何か案は?

4

3 に答える 3

4

distance計算値をwhere条件で使用することはできません 。

plz使用having

where ....
having distance < 50

ところで:距離の単位はキロメートルですか?

于 2012-12-02T16:00:12.177 に答える
0

WHERE句で列エイリアスを使用することはできません。

だからあなたは使うべきです

 WHERE (1.609344 * 3959 * acos( cos( radians('".$center_lat."') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('".$center_lng."') ) + sin( radians('".$center_lat."') ) * sin( radians( latitude ) ) ) ) < 50

または、クエリselectをテーブルとして追加します(テストされていません。しばらくお待ちください)

SELECT tmpt.distance, company_name, address, telephone, fax, contact_email, website, url, latitude, longitude, 
   FROM (SELECT *your expression* FROM table_name) AS tmpt, 
   cmsms_module_compdir_companies
   WHERE  status='published' AND latitude!='' AND longitude!='' AND distance<'50' ORDER BY distance limit 5
于 2012-12-02T16:00:49.237 に答える
0

ORDER BYGROUP BYおよびHAVING節でのみエイリアスを使用できます。 次のようにコードを使用するHAVINGためのクエリで使用します。distance

$query = sprintf("SELECT company_name, address, telephone, fax, contact_email, website, url, latitude, longitude, (1.609344 * 3959 * acos( cos( radians('".$center_lat."') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('".$center_lng."') ) + sin( radians('".$center_lat."') ) * sin( radians( latitude ) ) ) ) AS distance FROM cmsms_module_compdir_companies WHERE status='published' AND latitude!='' AND longitude!='' HAVING  distance<50 ORDER BY distance limit 5 ", mysql_real_escape_string($center_lat),
    mysql_real_escape_string($center_lng),
    mysql_real_escape_string($center_lat));
于 2012-12-02T16:05:38.543 に答える