Использование активной записи Codeigniter для запроса «на расстоянии» - PullRequest
3 голосов
/ 07 июля 2011

Я пытаюсь создать следующий запрос в CI, используя ActiveRecord

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 расстояние ОТ user_profiles HAVING distance <= 100 ЗАКАЗАТЬ <code>distance LIMI 'в строка 5

ВЫБРАТЬ * ОТ (locations) ГДЕ 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: \ WAMP \ WWW \ MySite \ система \ базы данных \ DB_driver.php

Номер строки: 330

Некоторые вещи, на которые стоит обратить внимание ... Я использую несколько where() функций в моей модели. Дистанционный запрос должен сосуществовать с другими предложениями.

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Вы устанавливаете вычисление distance как WHERE в своем SQL. Вы хотите это в своем 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);
0 голосов
/ 03 августа 2016

$ миль = 20; $ this-> db-> select ("*, (3959 * acos (cos (радианы ($ shop_lat)) * cos (радианы (lat)) * cos (радианы (lng) - радианы ($ shop_long)) + sin ( радианы ($ shop_lat)) * sin (радианы (лат)))) AS расстояние ");
$ This-> db-> из ( 'магазин'); $ this-> db-> Имеющий ('расстояние <='. $ миль); <br> $ This-> db-> order_by ( 'расстояние');
$ this-> db-> limit (20, 0); $ query = $ this-> db-> get (); $ result = $ query-> result (); вернуть $ результат; }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...