从DB中获取数组中每个ID的N个记录(Codeigniter)

hm2xizp9  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(94)

我花了2天时间搜索,希望这里有人能帮上忙。基本上,我正在尝试将一组用户ID发送到CI模型,并检索每个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添加一个限制,而不是只对整个数量添加一个限制?
我确实试过在模型中添加一个循环,但它只会不断向我抛出错误500s(我认为这与查询生成的方式有关??)
任何帮助都是非常感谢的

k5hmc34c

k5hmc34c1#

您可以搭配下列查询使用$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
");

相关问题