您的位置:首页 > 编程语言 > PHP开发

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

2013-04-28 19:52 375 查看
本文总结一下最近项目中用到的各种排序方法,如需转载,请注明文章出处


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;
}
}
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: