簡體   English   中英

Codeigniter-限制查詢“ where_in”中的項目

[英]Codeigniter - Limit items in query “where_in”

我想限制每個id的結果(數組id僅3個結果)。

如果我添加:

$this->db->limit(3);

我總共收到3條記錄; 但我想為每個ID記錄3條記錄。

我能怎么做?

<?php

$array = array('id' => 1, 'id' => 2, 'id' => 3);

class Your_model extends CI_Model
{
    public $db;
    public function __construct()
    {
       parent::__construct();
       $this->db = $this->load->database('default',true);     
    }

    public function function_name()
    {
        $this->db->select('file_name');
        $this->db->from('images_table');
        $this->db->where_in('id', $array);            
        $query = $this->db->get();                  

        $result = "";
        if($query->num_rows() > 0)
            $result = $query->result_array();
        else
            $result = "No result";

        print_r($result);
    }
}

每個組有兩種獲取n條記錄的方法,即,數組中的每個id是一個可以與許多文件名關聯的組。

第一種方法

使用mysql的GROUP_CONCATSUBSTRING_INDEX的組合GROUP_CONCAT將列中的所有值(即file_name與分隔符連接起來,您可以根據需要定義分隔符,在下面的查詢中,我使用了雙管道|| ,第二個SUBSTRING_INDEX (限制為3)將從GROUP_CONCAT提供的字符串中獲得提供的分隔符的3個位置

但是請注意,GROUP_CONCAT的默認限制是連接1024個字符,因此,如果每個id的文件名很多,它們將被截斷,但是可以通過設置GROUP_CONCAT手冊中定義的會話變量來增加GROUP_CONCAT的默認限制

SELECT 
SUBSTRING_INDEX(
GROUP_CONCAT( file_name SEPARATOR '||'),
'||',3) images
FROM images_table p
GROUP BY p.id

您可以在下面提供的演示中查看示例結果

現在,在您的應用程序級別,您只需要遍歷產品並按分隔符分割圖像

活動記錄查詢

$results=$this->db->select('SUBSTRING_INDEX(
GROUP_CONCAT( file_name SEPARATOR '||'),
'||',3) images',FALSE)
     ->from('images_table p')
     ->group_by('p.id')
     ->get()
     ->result_array();

foreach($results as $row):
$images =explode('||',$row['images ']);
    foreach($images as $m):
    ....
    endforeach;
endforeach;

演示版

第二種方法

您可以在查詢中使用用戶定義變量的其他方法來對每個組的項目進行排名

SELECT file_name,rank FROM(
SELECT file_name,
@r:= CASE WHEN id = @g THEN @r+1  ELSE @r:=1 END rank 
,@g:=id
FROM images_table,(SELECT @r:=0,@g:=0) t
ORDER BY id
  ) t
 WHERE rank < 4

現在無法使用活動記錄來編寫此查詢,因此您必須使用簡單的query()函數

    $results=$this->db
           ->query('SELECT file_name,rank FROM(
                    SELECT file_name,
                    @r:= CASE WHEN id = @g THEN @r+1  ELSE @r:=1 END rank 
                    ,@g:=id
                    FROM images_table,(SELECT @r:=0,@g:=0) t
                    ORDER BY id
                    ) t
                    WHERE rank < 4');

您可以在下面提供的演示中查看示例結果

演示版

根據評論編輯

要傳遞ID數組,只需使用活動記錄的where_in()

$results=$this->db->select('SUBSTRING_INDEX(
GROUP_CONCAT( file_name SEPARATOR '||'),
'||',3) images',FALSE)
     ->from('images_table p')
     ->where_in('p.id', $array)
     ->group_by('p.id')
     ->get()
     ->result_array();

對於原始查詢,您可以這樣做

    $results=$this->db
           ->query('SELECT file_name,rank FROM(
                    SELECT file_name,
                    @r:= CASE WHEN id = @g THEN @r+1  ELSE @r:=1 END rank 
                    ,@g:=id
                    FROM images_table,(SELECT @r:=0,@g:=0) t
                    WHERE id IN('.join(",",$array).')
                    ORDER BY id
                    ) t
                    WHERE rank < 4');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM