SQL cakephp3 ORM 中使用 DISTINCT 的案例查询
SQL case query with DISTINCT in cakephp3 ORM
我正在尝试在 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)
这样的代码,因为括号被忽略了,可以这么说,因为 不是 函数!
我不确定这是否有效,因为 SQL 规范明确允许像那样使用括号(也充当空白替代品),或者因为它是一个副作用,所以也许检查一下出来之前靠它!
也就是说,您可以使用链接 PR 中的解决方法,直到添加真正的聚合函数关键字支持,即执行如下操作:
"count_abc" => $query->func()->count(
$query->func()->DISTINCT([$abc_case])
)
这将生成 SQL 类似于:
(COUNT(DISTINCT(CASE WHEN ... END)))
我正在尝试在 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)
这样的代码,因为括号被忽略了,可以这么说,因为 不是 函数!
我不确定这是否有效,因为 SQL 规范明确允许像那样使用括号(也充当空白替代品),或者因为它是一个副作用,所以也许检查一下出来之前靠它!
也就是说,您可以使用链接 PR 中的解决方法,直到添加真正的聚合函数关键字支持,即执行如下操作:
"count_abc" => $query->func()->count(
$query->func()->DISTINCT([$abc_case])
)
这将生成 SQL 类似于:
(COUNT(DISTINCT(CASE WHEN ... END)))