【问题标题】:Getting a Syntax error on Doctrine CreateQueryBuilder with multiple SELECT使用多个 SELECT 在 Doctrine CreateQueryBuilder 上获取语法错误
【发布时间】:2019-12-02 05:13:42
【问题描述】:

我在下面有这个查询,它按预期返回所有内容。但是,运行时我得到一个学说语法错误,但我无法精确定位它。在 Doctrine 中添加多个选择有什么特殊的方法吗?

这是我的功能。

public function summaryReport()
{
    $qb = $this->createQueryBuilder('ds')
        ->select('ds.d_id, ds.d_name,
                        SUM(ds.c_email IS NOT NULL) * 100.00 / COUNT(c_number) AS percentage,
                        COUNT(DISTINCT ds.c_number) AS Qualifying_customers,
                        sum(ds.c_email IS not NULL) AS Qualifying_Customers_with_Email')
        ->groupBy('ds.d_id, ds.d_name')
        ->getQuery();
    dd($qb->getDQL());
    return $qb->getResult();
}

我收到的错误是

 Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got 'IS'

addSelect 会将它们分开吗?

【问题讨论】:

    标签: php orm doctrine symfony4 query-builder


    【解决方案1】:

    SUM(ds.c_email IS NOT NULL) 在这里不正确。 SUM函数定义为"SUM" "(" ["DISTINCT"] StringPrimary ")",这里的条件不接受。

    如果您希望NOT NULL 条件返回 1 或 0,则必须使用 IF 函数。例如:SUM(IF(ds.c_email IS NOT NULL, 1, 0))

    【讨论】:

    • 谢谢亚历山德罗,这不是为我做的。下面的答案确实如此。
    【解决方案2】:

    这是通过的查询

    public function summaryReport()
    {
        $qb = $this->createQueryBuilder('ds')
            ->select('ds.d_id, ds.d_name,
                            (sum(case  when  ds.c_email IS null then 0 else 1 end))*100/count(ds.c_number) as percentage')
            ->addSelect('COUNT(DISTINCT ds.c_number) AS qualifying')
            ->addSelect('sum(case when ds.c_email IS NULL then 0 else 1 end) AS qualifyingEmail')
            ->groupBy('ds.d_id, ds.d_name')
            ->getQuery();
    
        return $qb->getResult();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2022-10-20
      相关资源
      最近更新 更多