1

IDのリストを返すのでSPHINX、基準を使用して最終結果を並べ替える方法がわかりません。

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も使用しており、写真とビデオの関係を持つユーザーモデルを持っているので、これをテストすることができました. それでも、これでいいスタートが切れると思います。

[編集] また、これを少し最適化するために、写真とビデオのテーブルから ID のみを選択する Sphinx 専用のスコープを写真とビデオのモデルに作成することをお勧めします。それを使用するには、次のようにします。

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