Codeigniter - 限制查询“where_in”中的项目

时间:2014-05-25 17:53:05

标签: php mysql codeigniter activerecord

我想限制每个id的结果(数组ID只有3个结果)。

如果我添加:

$this->db->limit(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);
    }
}

1 个答案:

答案 0 :(得分:4)

有两种方法可以为每个组获取n条记录,即数组中的每个id都是一个可以有多个与之关联的file_names的组。

第一种方法

GROUP_CONCAT SUBSTRING_INDEXGROUP_CONCAT组合使用。它的作用file_name将连接列中的所有值,即||与分隔符您可以根据需要定义,在下面的查询中我使用了双管SUBSTRING_INDEX,第二个GROUP_CONCAT的限制为3将从SELECT SUBSTRING_INDEX( GROUP_CONCAT( file_name SEPARATOR '||'), '||',3) images FROM images_table p GROUP BY p.id 提供的字符串中获取3个提供的分隔符位置

  

但要注意这一事实GROUP_CONCAT的默认限制为1024个字符,所以如果每个id有很多file_names,它们将被截断,但是GROUP_CONCAT的默认限制可以通过设置GROUP_CONCAT&#39中定义的会话变量来增加。 ; s手册

$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

Demo

第二种方法

您可以在查询中使用用户定义的变量来为每个组的项目提供排名的其他方法

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'); 函数

where_in()

您可以在下面提供的演示

中查看示例结果

Demo

根据评论进行修改

要传递您的ID数组,只需使用有效记录$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');

对于原始查询,您可以这样做

{{1}}