【问题标题】:Codeigniter SET variable on query查询中的 Codeigniter SET 变量
【发布时间】:2025-12-10 09:15:01
【问题描述】:

我需要使用 Codeigniter 查询生成器执行此查询:

SET @row_number:=0;

SELECT Id, @row_number:=@row_number+1 as Position
FROM my_table
WHERE date='2015-12-26'

我可以像这样使用“$this-> db-> query”函数来做到这一点:

    $query = 'SET @row_number:=0;';
    $this-> db-> query ($query);

    $query = 'SELECT Id, @row_number:=@row_number+1 as Position';
    $query = $query . ' FROM my_table';
    $query = $query . ' WHERE date=\'' . $data . '\''

但是,我的问题是:有没有办法在不硬写查询的情况下做到这一点,所以写这样的东西:

        $query = 'SET @row_number:=0;';
        $this-> db-> query ($query);
        #*****It's wrong!!!!*****

        $this -> db -> select(array('Id', '@row_number:=@row_number+1 as Position'));
        $this -> db -> from('my_table');
        $this -> db -> where('date', $data);
        $query = $this -> db -> get();

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    无需pass array in select,您只需将查询编写为

     $this -> db -> select('Id, @row_number:=@row_number+1 as Position');
    

    【讨论】:

    • 它不起作用,因为生成的查询是这样的:SELECT 'Id', '@row_number:=@row_number+1' as Position FROM 'my_table' .我认为有两个问题: 1-它没有考虑查询的第一部分(SET @row_number:=0)。 2-使用您的解决方案,它会附加诸如 '@row_number:=@row_number+1' 之类的引号
    【解决方案2】:

    就我个人而言,我更喜欢按某个列对结果进行排序,并在 foreach 循环中添加所需的位置,因为它更有效,并且使代码更清晰 imo,尽管如此,这是可能的。

    解决方案的关键是CI db select函数的第二个可选参数,正如user guide中指出的那样:

    $this->db->select() 接受可选的第二个参数。如果您将其设置为 FALSE,CodeIgniter 将不会尝试保护您的字段或表名。如果您需要一个复合选择语句,其中自动转义字段可能会破坏它们,这将非常有用。

    像这样:

    $query = 'SET @row_number := 0';
    $this->db->query($query);
    
    $this->db->select(array('Id', '@row_number:=@row_number+1 as Position'), false);
    $this->db->from('my_table');
    $this->db->where('date', $data);
    $query = $this->db->get();
    

    【讨论】: