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('credits.credit_position', 'DESC')
->order_by('candidate_has_credits.date_created', 'DESC')

应该这样做,除了现在那些没有相应信用记录的 Candidate_has_credit 行(因此 credit_position 为空)将在最后,我假设你想要那些在顶部。

使用 DESC 排序时有一个小技巧可以将空值推到顶部,前提是您知道该字段中可用的最大值:

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

请注意,我使用的是 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 回答