PHP MySQL 语句 - "select as" 和 "where"
Posted
技术标签:
【中文标题】PHP MySQL 语句 - "select as" 和 "where"【英文标题】:PHP MySQL statement - "select as" with "where" 【发布时间】:2012-11-20 04:34:14 【问题描述】:我有以下 SQL 语句,它从数据库中选择公司(带有存储的 lat/lng)并显示离客户位置最近的 5 个位置。这是完美的工作:
$query = sprintf("选择公司名称、地址、电话、传真、 contact_email, 网站, url, 纬度, 经度, (1.609344 * 3959 * acos( cos( 弧度('".$center_lat."') ) * cos( 弧度( 纬度 ) ) * cos( 弧度( 经度 ) - 弧度('".$center_lng."') ) + sin( 弧度('".$center_lat."') ) * sin( 弧度(纬度) ) ) ) AS 距离 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("选择公司名称、地址、电话、传真、 contact_email, 网站, url, 纬度, 经度, (1.609344 * 3959 * acos( cos( 弧度('".$center_lat."') ) * cos( 弧度( 纬度 ) ) * cos( 弧度( 经度 ) - 弧度('".$center_lng."') ) + sin( 弧度('".$center_lat."') ) * sin( 弧度(纬度) ) ) ) AS 距离 cmsms_module_compdir_companies WHERE status='published' AND latitude!='' AND longitude!='' AND distance ORDER BY 距离限制 5", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat));
...但这根本不返回任何结果。
有什么想法吗?
【问题讨论】:
@alditis - 我试过了,没什么区别。 【参考方案1】:您不能在where
条件下使用计算值distance
。
请使用having
where ....
having distance < 50
顺便说一句:距离的单位是公里?
【讨论】:
请参考使用HAVING without GROUP BY? 谢谢,这是完美的,@chumkiu 它似乎在没有 GROUP BY 的情况下工作。 如果有人给我一个文档,我可以支持这个答案:-) 因为不适合我(可能是不同的 mysql 版本) @chumkiu ^_^ 自己试试。没有 GROUP BY 的 HAVING 可以正常运行。 Mysql 支持这种行为。 SQL 标准要求 HAVING 必须仅引用 GROUP BY 子句中的列或聚合函数中使用的列。但是,MySQL 支持对此行为的扩展,并允许 HAVING 引用 SELECT 列表中的列和外部子查询中的列。 @chumkiu 文档链接:dev.mysql.com/doc/refman/5.1/en/select.html 搜索 HAVING。【参考方案2】:您不能在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
【讨论】:
@AndreasLinden mmhhaving
仅适用于 group by
我认为【参考方案3】:
您只能在ORDER BY
、GROUP BY
和HAVING
子句中使用别名。
在查询distance
时使用HAVING
像这样使用您的代码:
$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));
【讨论】:
以上是关于PHP MySQL 语句 - "select as" 和 "where"的主要内容,如果未能解决你的问题,请参考以下文章