【问题标题】:Error in Nested SubQuery In DQL: Class '(' is not definedDQL 中嵌套子查询中的错误:未定义类“(”
【发布时间】:2014-07-06 21:23:48
【问题描述】:

我有一个如下所示的 DQL:

SELECT at, count(at.id) FROM AccountTriple at JOIN at.property p JOIN at.account ac WHERE p.create_analytics = '1' GROUP BY at.property, at.value, ac.service

如您所见,它有三个连接。因为'at'和'ac'都有大量数据。为了优化它,我试图将加入之前的“p.create_analytics = '1'”检查移动到“ac”,以给它一个较小的数据集来加入。我正在尝试实现这样的目标:

SELECT at, count(at.id) FROM ( SELECT at FROM AccountTriple at JOIN at.property p WHERE p.create_analytics = '1' ) JOIN at.account ac  GROUP BY at.property, at.value, ac.service

但不知何故,我的语法不起作用。错误信息显示如下:

语义错误] line 0, col 29 near '( SELECT at FROM': Error: Class '(' is not defined.

在其他任何地方也没有找到类似的例子。有谁可以帮助修复此 DQL 查询以使其正常工作?提前致谢。

【问题讨论】:

    标签: php mysql doctrine-orm doctrine dql


    【解决方案1】:

    使用 createSubquery() 函数在 Doctrine 中创建子查询。然后,您可以将子查询嵌套到主查询中。

    示例

    // build root query
    $query = Doctrine_Query::create()
      ->from('Movie m')
      ->where('name = ?', 'Prometheus')
    ;
    
    // build subquery
    $subquery = $query->createSubquery()
      ->from('SeenMovie sm')
      ->where('m.name = sm.name')
    ;
    
    // nest subquery and execute
    $query->where('EXISTS (' . $subquery->getDql() . ')')->execute();
    

    进一步阅读
    A Bulletproof Pattern for Creating Doctrine Subqueries of Any Complexity

    【讨论】:

    • 非常优雅的解决方案。不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    相关资源
    最近更新 更多