0

我有以下 SQL 语句,它从数据库中选择公司(带有存储的 lat/lng)并显示离客户位置最近的 5 个位置。这是完美的工作:

$query = sprintf("SELECT company_name、地址、电话、传真、contact_email、网站、url、纬度、经度、(1.609344 * 3959 * acos( cos( radians('".$center_lat."') ) * cos( radians ( 纬度 ) ) * cos( 弧度( 经度 ) - 弧度('".$center_lng."') ) + sin( 弧度('".$center_lat."') ) * sin( 弧度(纬度) ) ) ) AS distance FROM cmsms_module_compdir_companies WHERE status='published' AND latitude!='' AND longitude!='' 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 公里。我想我可以在下面用粗体添加一点:

$query = sprintf("SELECT company_name、地址、电话、传真、contact_email、网站、url、纬度、经度、(1.609344 * 3959 * acos( cos( radians('".$center_lat."') ) * cos( radians ( 纬度 ) ) * cos( 弧度( 经度 ) - 弧度('".$center_lng."') ) + sin( 弧度('".$center_lat."') ) * sin( 弧度(纬度) ) ) ) AS distance FROM cmsms_module_compdir_companies WHERE status='published' AND latitude!='' AND longitude!='' 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

您不能 distancewhere条件中使用计算值。

请使用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 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 BY,GROUP BY和 inHAVING子句中使用别名。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 回答