从DB中为数组中的每个ID获取N个重做(Codeigniter)



希望这里有人能帮我,因为我已经花了两天时间进行搜索。基本上,我试图向CI模型发送一组用户id,并为每个id检索最后10个事务。

我可以限制记录的总数,但我想限制为每个id,并且不知道如何做到这一点?

我读到ROW_NUMBER()可能是我想要的?但我不确定如何将它从SQL转换为适合在CI模型中使用的东西。以下是我目前拥有的代码:

function getTrans($cData, $date){
$this->db->select('id, userId, date');
$this->db->from('trans');
$this->db->where_in('userId', $cData);
if($date != 0){
$this->db->where('date >=', $date);
}

$this->db->order_by('id','asc');

$query = $this->db->get();
if ($query->num_rows() > 0) {
return $query->result();
} else {
return false;
}
}

正如你所看到的,我正在使用WHERE_IN来循环id数组,但有没有一种方法可以为调用的每个id添加一个限制,而不仅仅是对整个数量的限制?

我确实尝试在模型中添加一个循环,但它只会不断给我带来500秒的错误(我认为这与生成查询的方式有关?(

非常感谢任何帮助

您可以将$this->db->query()与以下查询一起使用:

$query = $this->db->query("
SELECT *
FROM 
(
SELECT
trans.*,
IF(@sameClass = userId, @rn := @rn + 1,
IF(@sameClass := userId, @rn := 1, @rn := 1)
) AS rank
FROM trans
CROSS JOIN (SELECT @sameClass := 0, @rn := 1 ) AS var
WHERE userId IN (" . implode(', ', $cData) . ")  
AND date >= {$date}
ORDER BY userId, id
) AS t
WHERE t.rank <= 10
ORDER BY t.userId, t.rank
");

最新更新