我想限制每个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);
}
}
答案 0 :(得分:4)
有两种方法可以为每个组获取n条记录,即数组中的每个id都是一个可以有多个与之关联的file_names的组。
将GROUP_CONCAT
SUBSTRING_INDEX
与GROUP_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
您可以在查询中使用用户定义的变量来为每个组的项目提供排名的其他方法
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()
您可以在下面提供的演示
中查看示例结果根据评论进行修改
要传递您的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}}