php - Codeigniter - 限制查询中的项目 "where_in"

标签 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);
    }
}

最佳答案

有两种方法可以获得每个组的 n 条记录,即数组中的每个 id 都是一个可以关联许多文件名的组。

第一种方法

将 mysql 的 GROUP_CONCATSUBSTRING_INDEX 组合使用。GROUP_CONCAT 的作用将连接列中的所有值,即 file_name 带有您可以根据需要定义的分隔符,在下面的查询中我使用了双管道 ||,第二个限制为 3 的 SUBSTRING_INDEX 将得到GROUP_CONCAT

提供的字符串中的 3 处提供的分隔符

But beaware of that fact GROUP_CONCAT has a default limit of 1024 characters to concat so if there many file_names per id they will be truncated,but default limit of GROUP_CONCAT can be increased by setting a session variable which is defined in GROUP_CONCAT's manual

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;

Demo

第二种方法

其他方法,您可以在查询中使用用户定义的变量来对每个组的项目进行排名

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

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

Demo

根据评论编辑

要传递您的 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');

关于php - Codeigniter - 限制查询中的项目 "where_in",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23858258/

相关文章:

php - EasyPHP 无法连接到本地主机

PHP 每晚 : Parameter must be an array or an object that implements Countable

php - Codeigniter 3.x/$config ['time_reference' ] = 'gmt' 无法按预期工作

php - 使用带有 ',' 复选框的两个值并使用 php[code igniter] 保存,使用 'Javascript' 计算

php - 如何过滤字符串中的多个限制词?

php - PHP 5.5 中未记录的 SessionIdInterface 是什么?

mysql - heroku JawsDB MySQL Addons 中的 "Databites"是什么意思?

php - 将 WooCommerce 自定义产品属性转换为定义的产品属性

MySQL 多个 Where 子句

php - 应用程序的后端和前端 - Codeigniter