【问题标题】:Add where clause to calculated field in cakephp 3 query在 cakephp 3 查询中将 where 子句添加到计算字段
【发布时间】:2021-04-01 02:17:13
【问题描述】:

我有一个查询,我想在其中找到一家公司的名称及其员工人数。问题是我想通过某些条件(如employee_number > 50 等)过滤此结果。我的问题是,在构建查询时,我不知道如何过滤这个结果,因为条件是在计算字段上设置的,所以在应用条件时它会给我以下内容

Error: `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'employee_number' in 'where clause'`.

我一直在尝试不同的东西,但这是我目前拥有的:

$query = $this->Companies->find('all')->where($conditions)->contain(['Users']);
        

$query
   ->select(['Users.name',
   'Company.modified',
   'employee_number' => $query->func()->count('DISTINCT(Employees.id)')])
   ->where('employee_number >' => 50 )
   ->leftJoinWith('Employees', function (\Cake\ORM\Query $query) {
       return $query->where(['deleted' => 0]);
   })
   ->group(['Employees.company_id', 'Company.id']);

【问题讨论】:

    标签: sql cakephp cakephp-3.0


    【解决方案1】:

    首先,您不能在 WHERE 子句中引用聚合,因为分组发生在之后,因此出现错误,当应用 WHERE 条件时,字段 employee_number 不存在,您有改为利用 HAVING 子句。

    根据您使用的 DBMS,您可以从选择列表中引用该列,例如 MySQL 允许:

    $query
        ->select([
            'Users.name',
            'Company.modified',
            'employee_number' => $query->func()->count('DISTINCT Employees.id')
        ])
        ->leftJoinWith('Employees', function (\Cake\ORM\Query $query) {
            return $query->where(['deleted' => 0]);
        })
        ->group(['Employees.company_id', 'Company.id'])
        ->having(['employee_number >' => 50]);
    

    例如 Postgres 没有,并且要求您在 HAVING 子句中重复聚合:

    ->having(function (
        \Cake\Database\Expression\QueryExpression $exp,
        \Cake\ORM\Query $query
    ) {
        return $exp->gt($query->func()->count('DISTINCT Employees.id'), 50);
    });
    

    ps。仅当您有多个连接会导致重复连接的行时才需要使用DISTINCT

    另见

    【讨论】:

    • 感谢您的回答!在这种情况下,我需要having子句。
    • 谢谢你,我可以通过添加having 子句使用我的计算字段进行过滤
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2011-02-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多