将 MYSQL 转换为 Codeigniter

Posted

技术标签:

【中文标题】将 MYSQL 转换为 Codeigniter【英文标题】:Converting MYSQL to Codeigniter 【发布时间】:2013-02-20 11:43:28 【问题描述】:

我正在尝试将 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 语句的正确方法有什么想法吗?感谢您的宝贵时间。

【问题讨论】:

非常相似的问题 ***.com/questions/15212189/… - 你不能在 CI 中直接使用活动记录进行子查询 您是否将 where 语句(如所写)称为子查询? 是的,它是查询中的查询,因此称为子查询。 CI 活动记录没有用于子查询的本机语法。但是,如果您对下面的 Wesleys 解决方案感到满意,我很高兴。 你为什么要使用不可读的 CI 活动记录表示法? SQL 是用于数据集操作的标准且众所周知的抽象语言。你为什么要抽象一个抽象?如果您使用 $this->db->query() 方法并编写普通 SQL,您的代码将更具可读性。 @PatrickSavalle 在这篇文章中是一个不好的例子,但它主要用于构建动态查询(if ($condition) $this->db->where($x) if ($otherCondition) $this->db->order_by($y)..etc。这比你自己将 SQL 字符串混合在一起更好。另一个原因是标准化不同数据库的不一致供应商(尽管大多数人使用 MySQL)。yadda yadda。 【参考方案1】:

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

【讨论】:

宾果游戏,这让我更接近了。现在我只需要充实一点html。谢谢韦斯利和其他所有人【参考方案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() 获取结果。

【讨论】:

我试过了,它不会让我使用 $query->result()(error) 即使没有它,它也不会返回数据 我很感激您的反馈,我会为自己的学习进行实验。 Wesley Murch 有正确的方法。万事如意!

以上是关于将 MYSQL 转换为 Codeigniter的主要内容,如果未能解决你的问题,请参考以下文章

将 MYSQL 转换为 Codeigniter

将 MySql 转换为 PostgreSQL

使用php将大量mysql记录转换为json

将 mySQL 日期转换为 Javascript 日期

将 Access SQL 转换为 MySQL

将字符串转换为日期mysql