0

codeigniters データベース ライブラリを使用してクエリを作成しました。次のようになります。

public function getCandidateCredits($candidate_id)
{
    $this->db->select('*')
    ->from('credits')
    ->join('candidate_has_credits', 'candidate_has_credits.credits_credit_id = credits.credit_id', 'left')
    ->where('credits.candidates_candidate_id', (int)$candidate_id)
    ->order_by('candidate_has_credits.date_created', 'DESC')
    ->order_by('credits.credit_position', 'DESC');



    $query = $this->db->get();

    return $query->result_array();
}

このクエリの目的は、すべてのメンバーのクレジットを取得し、最初に日付順 (新しい順)、次にクレジット位置順 (最大数が最初) に並べることです。

いくつか問題がありますが、クレジットは日付順に並べる必要がありますが、クレジット ポジションがない場合に限り、クレジット ポジション (0 - 999) がある場合は、クレジットを注文する場所が優先されます。日付とクレジット ポジションの場合、クレジットはクレジット ポジション、次に日付で並べ替える必要があります。

これは可能ですか?必要な場所から何マイルも離れているように感じます。返される結果は、明らかな順序で返されないようです。違いがあるかどうかはわかりませんが、date_created フィールドは DATETIME です。

4

2 に答える 2

1

左結合を正しく使用していますが、order by 句の順序が間違っているため、まずそれらを反転します。

->order_by('credits.credit_position', 'DESC')
->order_by('candidate_has_credits.date_created', 'DESC')

これでうまくいくはずですが、対応するクレジット レコードがない (つまり、credit_position が null である)candidate_has_credit 行が最後になり、それらを一番上に置きたいと思います。

そのフィールドで使用可能な最大値がわかっている場合に、DESC ソートを使用するときに null 値を一番上にプッシュする小さなトリックがあります。

->order_by("ifnull('credits.credit_position',1000) desc,candidate_has_credits.date_created desc")

パラメータを 1 つだけ含む order_by メソッドの形式を使用していることに注意してください。関数をエスケープしてはならず、わずかに高速です。

どのように機能するかについては、ifnull のドキュメントを参照してください。

于 2012-05-08T15:03:20.060 に答える
0

短縮版は次のとおりです。

public function getCandidateCredits($candidate_id)
{
    return $this->db->from('credits')
    ->join('candidate_has_credits', 'candidate_has_credits.credits_credit_id = credits.credit_id', 'left')
    ->where('credits.candidates_candidate_id', (int)$candidate_id)
    ->order_by('credits.credit_position', 'DESC')
    ->order_by('candidate_has_credits.date_created', 'DESC')
    ->get()->result_array(); 
}
于 2012-05-08T14:28:43.370 に答える