Комплексный поисковый запрос пользователя codeigniter - PullRequest
1 голос
/ 22 декабря 2011

У меня 3 таблицы user, profile и location.Структура этих таблиц:

user таблица

user_id | email | pass | activated | banned

profile таблица

user_id | name | birthday | picture | gender | last_active

location таблица

user_id | city | country | latitude | longitude

Теперь вот условия поиска:

  1. Пользователь должен быть активирован (1), чтобы появляться в результатах поиска.
  2. Пользователь не должен быть забанен (0).
  3. Результаты поиска должны располагаться поблизости в соответствии с широтой и долготой.
  4. Результаты поиска должны быть отсортированы по последним активным.

Для отображения поиска мне понадобится имя пользователя, фотография, город и страна, возраст, пол и статус «не в сети» / «онлайн».

У меня есть запрос на заказ по местоположению:

SELECT 
    latitude, longitude, 
    SQRT( POW( 69.1 * ( latitude - 52.58 ) , 2 ) + POW( 69.1 * ( - 1.12 - longitude ) * COS( latitude / 57.3 ) , 2 ) ) AS distance
FROM 
    location 
ORDER BY 
    distance

Может ли кто-нибудь внести свой вклад в создание запроса codeignitor для этих условий?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

Существует ряд других вариантов, в зависимости от того, насколько точным вы должны быть и как быстро вам это нужно.Я не буду показывать вам, как это сделать прямо здесь, но это основной запрос codeIgniter для того, что вы просили:

$max_distance = 20;

$this->db
   ->select('*') // Change this to only the fields you need...
   ->select('SQRT( POW( 69.1 * ( latitude - 52.58 ) , 2 ) + POW( 69.1 * ( - 1.12 - longitude ) * COS( latitude / 57.3 ) , 2 ) ) AS distance')
   ->from('user')
   ->where('user.active', 1)
   ->where('user.banned !=', 0)
   ->where('distance <', $max_distance)
   ->join('location','location.user_id=user.user_id')
   ->join('profile','profile.user_id=user.user_id')
   ->order_by('last_active','desc')
   ->get();

Обратите внимание, что вычисление расстояния становится медленным, как только у вас есть сотни тысячзаписей.Наиболее очевидная опция - сначала ограничить запрос полем, чтобы сократить необходимость вычислять расстояние для строк, которые не находятся рядом, а затем выполнить радиус внутри него.

0 голосов
/ 22 декабря 2011

вы можете попробовать построить вокруг этого запроса

select l.latitude, l.longitude, 
SQRT( POW( 69.1 * ( l.latitude - 52.58 ) , 2 ) +
POW( 69.1 * ( - 1.12 - l.longitude ) * COS( l.latitude / 57.3 ) , 2 ) ) as distance
from user as u
left join profile as p
on p.user_id = u.id
left join location as l
on l.user_id = u.id
where u.activated=1 and u.banned=0
order by distance desc

Могу ли я предложить вам поиск с использованием ограничений внешний ключ в MySQL

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