我想限制每个 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_CONCAT
与 SUBSTRING_INDEX
组合使用。GROUP_CONCAT
的作用将连接列中的所有值,即 file_name
带有您可以根据需要定义的分隔符,在下面的查询中我使用了双管道 ||
,第二个限制为 3 的 SUBSTRING_INDEX
将得到GROUP_CONCAT
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/