codeigniter-4 - 使用 CI4 事件记录编写 SQL 子查询

标签 codeigniter-4

我在使用事件记录在 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 对象的实例,这是通过从Database 调用静态方法connect() 来完成的> 属于 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() 方法接受第二个参数作为匿名函数,该函数采用 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

关于codeigniter-4 - 使用 CI4 事件记录编写 SQL 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66795533/

相关文章:

php - 如何使用codeigniter 4框架在mysql数据库中插入多行?

php - Codeigniter 4 验证可选值

php - CodeIgniter 4,辅助函数不起作用

codeigniter - 在没有 Composer 的情况下安装 CodeIgniter 4 的 Shield

codeigniter - 如何关闭新的 codeigniter 4 错误报告

php - 如何获取 CodeIgniter 4 中的特定列?

php - 如何在 codeigniter 4 中自动加载辅助函数

php - 如何在 CodeIgniter 4 中访问 Stripe

php - 代码点火器 4 : spark with multi public folders

Codeigniter 4 查询生成器连接 2 个或更多表而没有重复结果