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 mmh having 仅适用于 group by 我认为【参考方案3】:

您只能在ORDER BYGROUP BYHAVING 子句中使用别名。 在查询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"的主要内容,如果未能解决你的问题,请参考以下文章

PHP操作MySQL,删除一行数据库,怎么写?

在PHP中使用SQL语句 怎么取出查询出来的最后一个数据?

php中写入mysql的数据精确到秒,写查询语句的时候只要按天查,怎么写?

小白学习MySQL - 统计的"投机取巧"

小白学习MySQL - 统计的"投机取巧"

mysql批量修改字段动态内容的sql语句怎么写