首頁 >後端開發 >php教程 >复杂的SQL语句如何使用CDbCriteria来整合呢?

复杂的SQL语句如何使用CDbCriteria来整合呢?

WBOY
WBOY原創
2016-06-06 20:45:071230瀏覽

有这样一个SQL语句。是用来查询附近的人的。要知道有多少人使用。使用model的count方法。
下面是这个SQL语句:

<code class="lang-sql">SELECT userid ,username,homeland,headImage,(ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.' * 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6378.137) as distance from user,refresh order by distance where geohash=:geohash1 or geohash=:geohash2 or geohash=:geohash3 or geohash=:geohash4 or geohash=:geohash5 or geohash=:geohash6 or geohash=:geohash7  or geohash=:geohash8   or geohash=:geohash9" limit 0,10;

</code>

其中User表是记录了user的信息。refresh表记录了的是用户随时经度和维度的变化。

<code class="lang-php">        $criteria = new CDbCriteria;
        $criteria->addCondition('where geohash=:geohash1 or geohash=:geohash2 or geohash=:geohash3 or geohash=:geohash4 or geohash=:geohash5 or geohash=:geohash6 or geohash=:geohash7  or geohash=:geohash8   or geohash=:geohash9');
        $criteria->params=array(':current'=>$current);
        $criteria->order='distance DESC';
        $refreshModel=Refresh::model();
        $total=$planModel->count($criteria);
        $pager=new CPagination($total);
        $pager->pageSize=10;
        $pager->applyLimit($criteria);
        $planList=  $planModel->findAll($criteria);

</code>

然后使用relation规则来得到User表的信息。
请问这样做能不能达到预期的效果?
最后好像生成的数组还要变一下,然后才能返回有效的信息(JSON)给客户端、但是这个where条件太坑爹了。能不能稍稍优化一下。
最关键的是:
(ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.' * 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6378.137) as distance
这句话我该放在哪里?是放在select属性里面吗?

回复内容:

有这样一个SQL语句。是用来查询附近的人的。要知道有多少人使用。使用model的count方法。
下面是这个SQL语句:

<code class="lang-sql">SELECT userid ,username,homeland,headImage,(ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.' * 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6378.137) as distance from user,refresh order by distance where geohash=:geohash1 or geohash=:geohash2 or geohash=:geohash3 or geohash=:geohash4 or geohash=:geohash5 or geohash=:geohash6 or geohash=:geohash7  or geohash=:geohash8   or geohash=:geohash9" limit 0,10;

</code>

其中User表是记录了user的信息。refresh表记录了的是用户随时经度和维度的变化。

<code class="lang-php">        $criteria = new CDbCriteria;
        $criteria->addCondition('where geohash=:geohash1 or geohash=:geohash2 or geohash=:geohash3 or geohash=:geohash4 or geohash=:geohash5 or geohash=:geohash6 or geohash=:geohash7  or geohash=:geohash8   or geohash=:geohash9');
        $criteria->params=array(':current'=>$current);
        $criteria->order='distance DESC';
        $refreshModel=Refresh::model();
        $total=$planModel->count($criteria);
        $pager=new CPagination($total);
        $pager->pageSize=10;
        $pager->applyLimit($criteria);
        $planList=  $planModel->findAll($criteria);

</code>

然后使用relation规则来得到User表的信息。
请问这样做能不能达到预期的效果?
最后好像生成的数组还要变一下,然后才能返回有效的信息(JSON)给客户端、但是这个where条件太坑爹了。能不能稍稍优化一下。
最关键的是:
(ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.' * 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6378.137) as distance
这句话我该放在哪里?是放在select属性里面吗?

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn