zoukankan      html  css  js  c++  java
  • 在项目中灵活运用合适的排序方法(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;
        }
    }
    ?>



  • 相关阅读:
    mysql 索引
    私有变量 _变量名 、__变量名、__变量名__的区别
    python中 is 和 == 的区别
    赋值,浅拷贝,深拷贝
    Django model字段类型清单
    (转)nginx uwsgi wsgi django 这些东西究竟是什么关系
    线性结构
    复杂度_最大子列和问题(2)
    复杂度_最大子列和问题(1)
    应用实例——最大子列和问题
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3049955.html
Copyright © 2011-2022 走看看