1

我正在尝试将 MYSQL 查询转换为 codeigniter 并且没有真正快速的地方。我正在尝试转换此查询

$conn->prepare("SELECT `id`,`song`,`artist`,`album`,`track`,`mix_name`,`date` FROM `podcasts` where mix_number = (SELECT MAX(mix_number) FROM podcasts) order by track asc");

这是在我的模型中:

//$where = '(SELECT MAX(mix_number)from podcasts)';
$this->db->select('id,song,artist,album,track,mix_name,date, link');
//$this->db->where('mix_number', '(SELECT MAX(mix_number)from podcasts)');
$this->db->order_by('track', 'asc');
$query = $this->db->get('podcasts');
return $query->result();

我的问题区域在 where 语句中。当我注释掉 where 语句时,我得到了数据。显然不是我想要的方式。

我这样做是因为我的下一个查询将是

("SELECT `id`,`song`,`artist`,`album`,`track`,`mix_name`,`date` FROM `podcasts` where mix_number = **(SELECT MAX(mix_number) FROM podcasts) - 1** order by track asc")

一直到(SELECT MAX(mix_number) FROM podcasts) - 3

关于编写 where 语句的正确方法有什么想法吗?谢谢你的时间。

4

2 回答 2

5

设置 to 的第三个参数where()false防止 CI 更改您传递给第二个参数的字符串,然后您可以执行子查询:

return $this->db
    ->select('id,song,artist,album,track,mix_name,date, link')
    ->where('mix_number', '(SELECT MAX(mix_number) from podcasts)', false)
    ->order_by('track', 'asc')
    ->get('podcasts')
    ->result();

https://www.codeigniter.com/userguide2/database/active_record.html

$this->db->where()接受可选的第三个参数。如果您将其设置为 FALSE,CodeIgniter 将不会尝试使用反引号保护您的字段或表名。

对我来说,这会产生以下查询:

SELECT `id`, `song`, `artist`, `album`, `track`, `mix_name`, `date`, `link`
FROM (`podcasts`)
WHERE mix_number = (SELECT MAX(mix_number) from podcasts) ORDER BY `track` asc
于 2013-03-05T21:43:32.320 回答
2

如果您对使用 CodeIgniter 的 Active Record 语法不太讲究,您可以简单地按原样使用您的查询:

$sql = "SELECT `id`,`song`,`artist`,`album`,`track`,`mix_name`,`date` FROM `podcasts` where mix_number = (SELECT MAX(mix_number) FROM podcasts) order by track asc";

$this->db->query($sql);

然后$query->result()用来得到你的结果。

于 2013-03-05T21:40:48.303 回答