mysql一个字段按不同的优先级排序

时间:2015-04-29 09:15:46

标签: php mysql codeigniter

我有一个表,其中有一个pay_mode字段,其中SUBSCRIPTION,ONETIME,FREE是条目,所以我想通过随机顺序获取SUBSCRIPTION,ONETIME上的记录,而免费列表按降序排列(NOT BY RANDOM)日期。

   $this->db->select("p.*", FALSE);                  
   $this->db->from($this->table_classified." p");
   $this->db->where('p.is_active', '1');
   $this->db->where('p.is_deleted', 'NO');

   $this->db->order_by("(CASE `pay_mode`
            WHEN 'RECURRING' THEN 3
            WHEN 'ONETIME' THEN 2
            WHEN 'FREE' THEN 1
         END)",'DESC');

   $this->db->order_by('pay_mode', 'RANDOM');
   $query    = $this->db->get(); 

请找到架构here

3 个答案:

答案 0 :(得分:1)

您可以在codeigniter上编写自定义查询,然后您可以随机获取重复和一次性,然后使用union并按desc顺序获取免费列表。

 $query = "(SELECT * 
     FROM   (SELECT nc_classified.*, 
                    nc_classified_category.title_zh AS cat_title_zh, 
                    nc_classified_category.title    AS cat_title 
             FROM   `nc_classified` 
                    LEFT JOIN `nc_classified_category` 
                           ON nc_classified.cat_id = nc_classified_category.id 
             WHERE  ( $where ) 
                    AND `pay_mode` IN( 'RECURRING', 'ONETIME' ) 
             ORDER  BY ( CASE `pay_mode` 
                           WHEN 'RECURRING' THEN 1 
                           WHEN 'ONETIME' THEN 2 
                         end ), 
                       Rand()) a) 
    UNION 
    (SELECT * 
     FROM   (SELECT nc_classified.*, 
                    nc_classified_category.title_zh AS cat_title_zh, 
                    nc_classified_category.title    AS cat_title 
             FROM   `nc_classified` 
                    LEFT JOIN `nc_classified_category` 
                           ON nc_classified.cat_id = nc_classified_category.id 
             WHERE  ( $where ) 
                    AND `pay_mode` IN( 'FREE' ) 
             ORDER  BY id DESC) a) ";

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

答案 1 :(得分:0)

使用此代码并按asc,desc或RANDOM设置订单

$this->db->select("p.*, (CASE `pay_mode` WHEN 'RECURRING' THEN 3 WHEN 'ONETIME' THEN 2 WHEN 'FREE' THEN 1 END) as pay_mode_no");</p>

$this->db->from('classified as p');

$this->db->where('p.is_active', '1');
$this->db->where('p.is_deleted', 'NO');

$this->db->order_by('pay_mode_no', 'ASC');
$this->db->get()->result();

答案 2 :(得分:0)

您的pay_mode列是枚举,按pay_mode排序将立即生效:

$this->db->order_by('pay_mode', 'DESC'); // RECURRING -> ONETIME -> FREE

$this->db->order_by('pay_mode', 'ASC'); // FREE -> ONETIME -> RECURRING

对于随机化部分,我建议您在PHP代码中执行此操作(请参阅示例shuffle)。