CodeIgniter db select返回不同于SQL查询的结果


CodeIgniter db select returns different result than SQL query

我想使用CI Active Record方法来执行这个查询,但是它给我的结果与用普通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

CodeIgniter:

$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调用最终返回最老的行,而不是次老的行。我想这只是我的CI调用中的语法错误……但我想不明白。从那以后,我开始解决$this->db->query("the SQL")的问题,但这仍然困扰着我。

有人知道为什么CI版本不能工作吗?

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

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

我不确定Active Record是否会在您的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指出的,by的顺序应该有两个参数