2013-05-07 89 views
0

我想使用CI Active Record方法来执行此查询,但它给我的结果与我在普通SQL中执行查询的结果不同。这是查询:CodeIgniter db select返回与SQL查询不同的结果

SELECT B.id as id 
FROM default_log_workout A, default_log_workout B 
WHERE A.id=$id AND B.completed < A.completed AND A.workout_id=B.workout_id 
ORDER BY B.completed desc 
LIMIT 1 

笨:

$this->db->select("B.id as id"); 
$this->db->from("log_workout A, log_workout B"); 
$this->db->where(array("A.id" => $id, "B.completed < A.completed", "A.workout_id=B.workout_id")); 
$this->db->order_by("B.completed desc"); 
$this->db->limit(1); 
$res = $this->db->get(); 

查询应返回基于给定的 “ID” 下一个较旧的行。普通的SQL工作,CI调用最终返回OLDEST行,而不是下一个最老的行。我认为这只是我的CI调用中的语法错误......但我无法弄清楚。我后来解决了$this->db->query("the SQL")这个问题,但这仍然困扰着我。

任何人都知道为什么CI版本不起作用?

+0

请注意,您在SQL中使用'default_log_workout',在ActiveRecord中使用'log_workout'。也可能最好多次调用' - > where''而不是传递一个数组。它更清晰。 – deed02392 2013-05-07 15:40:05

+0

使用'$ this-> db-> last_query()'并比较两者,看看有什么不同。应该帮助你缩小罪魁祸首。听起来像ORDER BY亲自,如果你得到错误的日期结果。 – 2013-05-07 19:00:59

回答

1

ORDER BY子句应该有两个参数:

$this->db->order_by('B.completed', 'DESC'); 
0

我不知道,如果活动记录会在你from()条款解析您的逗号分隔表的字符串。我建议用ANSI标准from ... join ... on语法重写它。

$this->db->select("B.id as id"); 
$this->db->from("log_workout A"); 
$this->db->join("log_workout B","A.workout_id = B.workout_id AND B.completed < A.completed"); 
$this->db->where("A.id" => $id); 
$this->db->order_by("B.completed", "desc"); 
$this->db->limit(1); 
$res = $this->db->get(); 

而且,正如Yan指出的那样,顺序应该有两个参数。