复杂的codeigniter用户搜索查询

时间:2011-12-22 08:27:17

标签: php mysql codeigniter

我有3个表用户,个人资料和位置。这些表的结构是:

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. 搜索结果必须按上次活动排序。
  5. 要显示搜索,我需要用户名,图片,城市和国家/地区,年龄,性别和离线/在线状态。

    我有一个按地点排序的查询:

    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 :(得分:0)

您可以尝试围绕此查询构建

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

中的外键约束进行查找

答案 1 :(得分:0)

还有许多其他优化措施取决于您需要的准确程度以及您需要的速度。我不会在这里向您展示如何做到这一点,但这是您提出的问题的基本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();

请注意,只要您拥有数十万条记录,距离计算就会变慢。最明显的优化是首先用一个框来限制查询,以减少必须计算远离的行的距离,然后在其中进行半径。