【问题标题】:Doctrine convert SQL with subquery to DQLDoctrine 将带有子查询的 SQL 转换为 DQL
【发布时间】:2016-02-17 16:25:29
【问题描述】:

我正在使用 Doctrine 和 DQL 函数 createQuery() 我有这个查询:

SELECT id, 1 + (
    SELECT count( * )
    FROM user a
    WHERE a.points > b.points ) AS RNK, points
FROM user b

此查询返回使用字段points 计算的排名。

如何转换此查询以在 createQuery() 中使用?

现在我有:

$query = $this->getEntityManager()->createQuery("
    SELECT id, 1+(
        SELECT count(*) 
        from AppBundle\Entity\User a 
        WHERE a.points > b.points) as RNK, points 
    FROM AppBundle\Entity\User b
");

但这会返回语法错误:"[Syntax Error] line 0, col 14: Error: Expected Literal, got 'SELECT'"

【问题讨论】:

    标签: php mysql symfony doctrine-orm doctrine


    【解决方案1】:

    试试这个:

    $query = $this->getEntityManager()->createQuery("
    SELECT b.id, 1+(
        SELECT count(a) 
        from AppBundle\Entity\User a 
        WHERE a.points > b.points) as RNK, points 
    FROM AppBundle\Entity\User b");
    

    【讨论】:

      【解决方案2】:

      因为要获取同一个实体(USER)的编号,何不干脆做:

      $query = $this->getEntityManager()->createQuery("
          SELECT u.id, 1+count(u.*) as RNK, u.points FROM AppBundle\Entity\User u
      ");
      

      来自文档:doctrine chap 14.2.4:

      $query = $em->createQuery('SELECT COUNT(u.id) FROM Entities\User u');
      

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2014-07-12
        相关资源
        最近更新 更多