在cakephp3 ORM中使用DISTINCT的SQL案例查询

时间:2019-02-01 11:55:55

标签: sql cakephp orm cakephp-3.0 cakephp-3.6

我正在尝试在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),
]);

但是我不能在此代码中应用不同的代码。

1 个答案:

答案 0 :(得分:1)

在函数中使用关键字已经有一段时间了,例如,请参见此问题记录: 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)))