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