我有以下SQL语句从数据库中选择公司(使用存储的lat / lng)并显示最近的5个位置到客户的位置。这非常有效:
$ query = sprintf(“SELECT company_name,address,telephone,fax, contact_email,网站,网址,纬度,经度,(1.609344 * 3959 * acos(cos(radians('“。$ center_lat。”'))* cos(弧度(纬度))* cos(弧度(经度) - 弧度('“。$ center_lng。”'))+ sin( 弧度('“。$ center_lat。”'))* sin(弧度(纬度))))AS 距离FROM cmsms_module_compdir_companies WHERE status ='published' AND latitude!=''和经度!=''按距离限制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,address,telephone,fax, contact_email,网站,网址,纬度,经度,(1.609344 * 3959 * acos(cos(radians('“。$ center_lat。”'))* cos(弧度(纬度))* cos(弧度(经度) - 弧度('“。$ center_lng。”'))+ sin( 弧度('“。$ center_lat。”'))* sin(弧度(纬度))))AS 距离FROM cmsms_module_compdir_companies WHERE status ='published' AND latitude!=''AND经度!=''和距离< '50' ORDER BY 距离限制5“,mysql_real_escape_string($ center_lat),
mysql_real_escape_string($ center_lng),
mysql_real_escape_string($ center_lat));
...但这根本不会返回任何结果。
有什么想法吗?
答案 0 :(得分:2)
您无法在distance
条件中使用计算值where
。
使用having
where ....
having distance < 50
顺便说一句:距离的单位是公里?
答案 1 :(得分: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
答案 2 :(得分:0)
您只能在ORDER BY
,GROUP 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));