1

SPHINX返回一个 id 列表时,我看不到如何使用标准对我的最终结果进行排序。

我有一个包含 id 的数组:

$a = array(1,2,3,4,5);

这个 id 数组是由SPHINX搜索引擎作为结果给出的。

我想使用这个数组并通过 id 提取所需的数据作为 PK,但我必须像这样对结果进行排序:

有视频和照片的用户在所有只有照片的用户之前,有照片的用户在列表中,然后那些有照片的用户应该按照他们最近登录的时间排序,最近的登录在列表的顶部。在所有有照片的用户之后,其余的用户应该在那里,最近登录的用户最先登录。

我试过这个,没有订单字段,因为我不知道如何编写代码;

$criteria = new CDbCriteria();
$criteria->addInCondition('id', $a);
$criteria->order = "FIELD(id, " . join(',', $a) . ")";

$dataProvider = new CActiveDataProvider('user', array(
                    'criteria' => $criteria,
                    'pagination' => array(
                    'pageSize' => $this->pageSize,
                    ),
                ));

有人尝试过这样的事情吗?或其他建议?

4

1 回答 1

1

假设您为视频和照片设置了关系,您可以尝试以下操作:

$criteria = new CDbCriteria;
$criteria->order = '
    IF(videos.id IS NOT NULL AND photos.id IS NOT NULL, 1, 0) DESC,
    IF(photos.id IS NOT NULL, t.lastvisit, 0) DESC,
    IF(videos.id IS NULL AND photos.id IS NULL, t.lastvisit, 0) DESC';
$criteria->group = 't.id';

$users = User::model()->with(array('photos', 'videos')))->findAllByPk($c, $criteria); 

$dataProvider = new CArrayDataProvider($users, array(
    'pagination' => array(
        'pageSize' => $this->pageSize,
    ),
));

确保将 lastvisit 更改为用于存储他们上次登录时间的字段。

我也在使用 Yii + Sphinx 并拥有带有照片和视频关系的用户模型,因此我能够对此进行测试并且它对我有用,但有可能我很幸运并且我的数据自行排序。不过,我认为这会给你一个好的开始。

[编辑] 另外,为了优化这一点,我建议在照片和视频模型中专门为 Sphinx 创建一个范围,它只从照片和视频表中选择 id。然后使用它你会做:

User::model()->with(array('photos:sphinx', 'videos:sphinx')))->findAllByPk($c, $criteria);
于 2013-01-24T19:35:38.340 回答