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

Cyb*_*kie 4 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
Run Code Online (Sandbox Code Playgroud)

我试过

$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);
Run Code Online (Sandbox Code Playgroud)

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

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

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 5 行的“AS distance FROM user_profiles HAVING distance <= 100 ORDER BY distanceLIMI”附近使用的正确语法

SELECT * FROM ( locations) WHERE country= 'US' AND tags= 'technology' AND ( 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 HAVINGdistance <= 100 ORDER BYdistance` LIMIT 20

文件名:C:\wamp\www\mysite\system\database\DB_driver.php

行号:330

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

Aar*_* W. 5

您在 SQL中将distance计算设置为 a 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);
Run Code Online (Sandbox Code Playgroud)