加载中...

在项目中灵活运用合适的排序方法(Sphinx,SQL,Yii,数组)


本文总结一下最近项目中用到的各种排序方法,如需转载,请注明文章出处微笑


1,Sphinx排序

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

其中
  1. 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,'************')来实现


  1. 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

  1. $sql = "SELECT id, name FROM shop WHERE id IN(".join(',', array_keys($IDARRAY)).") order by find_in_set(id,'".join(',', array_keys($IDARRAY))."') ";
  2. $rawDataAll = Yii::app()->db->createCommand($sql)->queryAll();


关于find_in_set(id,'************'),的用法扩展可以

参考:mysql中替代charindex的函数substring_index、find_in_set


3,Array数组根据自己的任意元素进行排序


把这个方法封装成一个类,在Yii项目中随意调用

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

  1. <?php
  2. class ArrayHelper extends CController
  3. {
  4. public function array_sort($arr, $keys, $type='asc')
  5. {
  6. $keysvalue = $new_array = array();
  7. foreach($arr AS $k=>$v)
  8. {
  9. $keysvalue[$k] = $v[$keys];
  10. }
  11. if($type == 'asc')
  12. {
  13. asort($keysvalue);
  14. }
  15. else
  16. {
  17. arsort($keysvalue);
  18. }
  19. reset($keysvalue);
  20. foreach ($keysvalue as $k=>$v)
  21. {
  22. $new_array[$k] = $arr[$k];
  23. }
  24. return $new_array;
  25. }
  26. }
  27. ?>



还没有评论.