codeigniter-4 - 使用 CI4 活动记录编写 SQL 子查询
问题描述
我正在努力在 Codeigniter 4 中使用带有活动记录的子查询编写我的 sql 语句。
SQL
SELECT
p.id, p.catId, p.image, c.id, (c.name) as category
FROM
product_feature p
JOIN
categories c ON p.catId = c.id
WHERE
p.id IN(
SELECT MAX(p.id) FROM product_feature p
GROUP BY p.catId
)
解决方案
除子查询部分外,所有部分都易于编写且直截了当。
第一步是获取BaseConnection
对象的实例,这是通过从属于命名空间connect()
的Database
类中调用静态方法来完成的Config
:
$db = \Config\Database:connect();
现在,您需要加载查询构建器类的实例并将第一个表的名称传递给它:
$builder = $db->table("product_feature p");
现在,您应该使用该select()
方法来编写SELECT
查询的一部分:
$builder->select("p.id, p.catId, p.image, c.id, c.name AS category");
之后,您必须使用该join()
方法编写JOIN
代码的一部分:
$builder->join("categories c", "p.catId = c.id");
现在我们来到有趣的部分,如何编写子查询?
实际上,whereIn()
method 接受第二个参数作为匿名函数,该函数接受一个BaseBuilder
可用于编写子查询的实例,例如:
$builder->whereIn("p.id", function (BaseBuilder $subqueryBuilder) {
return $subqueryBuilder->selectMax("p.id")->from("product_feature p")->groupBy("p.catId");
});
现在让我们把它们放在一起:
$db = \Config\Database::connect();
$builder = $db->table("product_feature p");
$builder->select("p.id, p.catId, p.image, c.name AS category");
$builder->join("categories c", "p.catId = c.id");
$builder->whereIn("p.id", function (BaseBuilder $subqueryBuilder) {
return $subqueryBuilder->selectMax("p.id")->from("product_feature p")->groupBy("p.catId");
});
这将产生您正在寻找的所需结果,因为如果您getCompiledSelect()
在构建器实例上使用该方法,您将获得以下结果:
SELECT `p`.`id`, `p`.`catId`, `p`.`image`, `c`.`id`, `c`.`name` AS `category`
FROM `product_feature` `p`
JOIN `categories` `c` ON `p`.`catId` = `c`.`id`
WHERE `p`.`id` IN (SELECT MAX(`p`.`id`) AS `id` FROM `product_feature` `p` GROUP BY `p`.`catId`)
我建议您查看有关查询生成器和匿名函数的 CodeIgniter4 文档:
http://codeigniter.com/user_guide/database/query_builder.html#looking-for-specific-data
推荐阅读
- php - cookie 会在服务器 IP 更改时过期吗?
- vhdl - 模拟器和合成器初始化状态机的区别
- javascript - 在 Ionic 框架和 Parse-Server 中导出 CSV
- bootstrap-4 - 在引导程序中,4 个导航栏元素在小屏幕分辨率上低于其他元素
- javascript - 无法使用 js 滚动 div 溢出的按钮
- python - 有没有更好的方法来设置每行具有不同高度的不同列的图形?
- jquery - jquery 删除一个
- 没有从列表中删除节点
- python - 数据框到列表列表
- node.js - 在 Javascript 中添加缺少的 XML 结束标记
- amazon-web-services - 你能在多个 lambda 函数中添加一项 alexa 技能吗