sql - cakephp3 ORM中带有DISTINCT的SQL案例查询
问题描述
我正在尝试在 cakephp 3 中构建具有不同计数的案例查询。
这是 SQL 中的查询:
select COUNT(distinct CASE WHEN type = 'abc' THEN app_num END) as "count_abc",COUNT(distinct CASE WHEN type = 'xyz' THEN app_num END) as "count_xyz" from table;
目前,我做到了这一点:
$query = $this->find();
$abc_case = $query->newExpr()->addCase($query->newExpr()->add(['type' => 'abc']),' app_num','string');
$xyz_case = $query->newExpr()->addCase($query->newExpr()->add(['type' => 'xyz']),'app_num','string');
$query->select([
"count_abc" => $query->func()->count($abc_case),
"count_xyz" => $query->func()->count($xyz_case),
]);
但我不能在这段代码中应用 distinct。
解决方案
在函数中使用关键字很长一段时间以来一直是个问题,例如,请参阅此问题单:https ://github.com/cakephp/cakephp/issues/10454 。
这在https://github.com/cakephp/cakephp/pull/11410中有所改进,因此现在可以(错误)使用函数表达式DISTINCT
作为一种解决方法,即生成类似 的代码DISTINCT(expression)
,这是因为括号被忽略了,可以这么说,因为DISTINCT
它不是一个函数!
我不确定这是否有效,因为 SQL 规范明确允许像这样使用括号(也充当空格替代品),或者因为它是一种副作用,所以也许在依赖它之前检查一下!
话虽如此,您可以使用链接 PR 中的解决方法,直到添加真正的聚合函数关键字支持,即执行以下操作:
"count_abc" => $query->func()->count(
$query->func()->DISTINCT([$abc_case])
)
这将生成类似于以下内容的 SQL:
(COUNT(DISTINCT(CASE WHEN ... END)))
推荐阅读
- python - 使用python计算csv文件中的逗号
- javascript - 使用 jquery 动态更改文本
- android - 什么占用了 Android Profiler 中的图形内存?
- r - 给定data.frame的特定行中的另一个日期,如何过滤过去的日期?
- java - 复选框验证,仅获取选中的复选框
- ios - 无法通过选择性注册构建 tensorflow iOS 二进制文件
- yii2 - Yii2 框架中的 CDbCriteria 在哪里?
- c++ - protobuf,dose release_* 方法导致函数中的内存泄漏?
- avro - 如何使用 Spring-Kafka 通过 Confluent Schema 注册表读取 AVRO 消息?
- sql-server - 如何刷新链接服务器中的表列表?