在項目中靈活運用合適的排序方法(Sphinx,SQL,Yii,數組)

本文總結一下最近項目中用到的各種排序方法,如需轉載,請註明文章出處微笑


1,Sphinx排序

        Yii::import('ext.SphinxClient');
        $sphinxapi = new SphinxClient();
        $sphinxapi->SetServer('127.0.0.1', 10312);
        $sphinxapi->SetConnectTimeout(3);
        $sphinxapi->SetMatchMode(SPH_MATCH_BOOLEAN);
        $sphinxapi->SetArrayResult(true);
        $sphinxapi->SetGroupBy('type', SPH_GROUPBY_ATTR,"@count desc");
        $sphinxapi->SetLimits(0, 9999, 10000);
        $result = $sphinxapi->Query('', 'main;delta');
        unset($sphinxapi);

其中
 SPH_GROUPBY_ATTR,"@count desc"
指定了按照 @count 降序排列


2,SQL排序(讓某一列根據指定的數組排序,而不是本表字段)

         

有時候我們需要從數據庫中找到的數據按照我們已有的數組順序進行排列,而不是簡單的根據數據表字段進行 order by

比如:

我們有一個數組 $IDArray=array(13,24,2,23,21,10,22,12,26,27,19,20,8,14,25,9,11,1,6);

現在需要從shop表中查找19個數據,並且讓shop的id根據$IDArray中的順序來排列

可以使用,find_in_set(id,'************')來實現


SELECT id, name FROM shop WHERE id IN(13,24,2,23,21,10,22,12,26,27,19,20,8,14,25,9,11,1,6) order by find_in_set(id,'13,24,2,23,21,10,22,12,26,27,19,20,8,14,25,9,11,1,6')

當然,我們遇到的常常是動態的情況,這是可以用數組->字符串的法寶 join

$sql = "SELECT id, name FROM shop WHERE id IN(".join(',', array_keys($IDARRAY)).") order by  find_in_set(id,'".join(',', array_keys($IDARRAY))."') ";

$rawDataAll = Yii::app()->db->createCommand($sql)->queryAll();


關於find_in_set(id,'************'),的用法擴展可以

參考:mysql中替代charindex的函數substring_index、find_in_set


3,Array數組根據自己的任意元素進行排序


把這個方法封裝成一個類,在Yii項目中隨意調用

ArrayHelper::array_sort($bodyArray, 'count', 'desc')

<?php
class ArrayHelper extends CController
{
    public function array_sort($arr, $keys, $type='asc')
    {
        $keysvalue = $new_array = array();
        foreach($arr AS $k=>$v)
        {
            $keysvalue[$k] = $v[$keys];
        }
        if($type == 'asc')
        {
            asort($keysvalue);
        }
        else
        {
            arsort($keysvalue);
        }
        reset($keysvalue);
        foreach ($keysvalue as $k=>$v)
        {
            $new_array[$k] = $arr[$k];
        }
        return $new_array;
    }
}
?>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章