将 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的主要内容,如果未能解决你的问题,请参考以下文章