在项目中灵活运用合适的排序方法(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;
    }
}
?>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值