有两种方法可以获取每个组的 n 条记录,即数组中的每个 id 都是一个组,可以有许多与之关联的文件名。
第一种方法
使用 mysql 的 GROUP_CONCAT 和 SUBSTRING_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');
您可以在下面提供的演示中查看示例结果
从 cmets 编辑
要传递您的 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');