Codeigniter SET查询变量

时间:2015-12-26 13:21:47

标签: php mysql codeigniter

我需要使用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 = '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();

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

就个人而言,我宁愿按某列对结果进行排序,并在foreach循环中添加所需的位置,因为这样可以提高效率,并保持代码更干净的imo,但是还是可以的。

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

  

$ 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();