使用Codeigniter活动记录进行“距离内”查询

时间:2011-07-06 22:33:47

标签: php mysql codeigniter map

我正在尝试使用ActiveRecord

在CI中创建以下查询
SELECT *, 
   ( 3959 * acos( cos( radians($lat) ) 
   * cos( radians( lat ) ) 
   * cos( radians( lng ) - radians($lng) ) 
   + sin( radians($lat) ) 
   * sin( radians( lat ) ) ) ) AS distance 
FROM locations 
HAVING distance <= $miles 
ORDER BY distance 
LIMIT 0, 20

我试过

$where = "( 3959 * acos( cos( radians($lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) AS distance FROM locations";        
$this->db->where($where);                           
$this->db->having('distance <= ' . $miles);                     
$this->db->order_by('distance');                    
$this->db->limit(20, 0);

问题(我认为)是我已经告诉我在哪个表格中通过$query = $this->db->get('locations');在模型结尾处获取数据。所以我收到以下错误:

  

发生数据库错误错误   编号:1064

     

您的SQL语法有错误;   检查对应的手册   您的MySQL服务器版本   正确的语法在'AS距离附近使用   FROM user_profiles HAVING distance   &lt; = 100 ORDER BY distance LIMI'at   第5行

     

SELECT * FROM(locations)WHERE   country ='美国'和tags ='技术'和 ( 3959 * acos( cos( radians(25.9331488) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-80.1625463) ) + sin( radians(25.9331488) ) * sin( radians( lat ) ) ) ) AS distance FROM locations HAVING距离<= 100 ORDER BY距离'限制20

     

文件名:   C:\瓦帕\ WWW \ mysite的\ SYSTEM \数据库\ DB_driver.php

     

行号:330

有些事情要注意..我在我的模型中使用了一些where()函数。距离查询应与其他子句共存。

2 个答案:

答案 0 :(得分:4)

您在SQL中将distance计算设置为WHERE。你想要它在SELECT中。没有测试,但尝试:

$this->db->select("*, ( 3959 * acos( cos( radians($lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) AS distance");                         
$this->db->having('distance <= ' . $miles);                     
$this->db->order_by('distance');                    
$this->db->limit(20, 0);

答案 1 :(得分:-1)

$ miles = 20;         $ this-&gt; db-&gt; select(“*,(3959 * acos(cos(弧度($ shop_lat))* cos(弧度(纬度))* cos(弧度(lng) - 弧度($ shop_long))+ sin(弧度($ shop_lat))* sin(弧度(纬度))))AS距离“);
        $这 - &GT; DB-肽从( '店');         $ this-&gt; db-&gt; having('distance&lt; ='。$ miles);
        $这 - &GT; DB-&GT; ORDER_BY( '距离');
        $ this-&gt; db-&gt; limit(20,0);         $ query = $ this-&gt; db-&gt; get();         $ result = $ query-&gt; result();         返回$ result; }