使用 Symfony 2 和 Doctrine,我正在寻找一种方法来选择在特定列中具有最大值的每一行。

现在,我在两个查询中执行此操作:

  • 1 获取表中列的最大值
  • 然后我选择具有此值的行。

  • 我相信这可以通过一个查询来完成。

    搜索,我在 this answer 中找到了 a thread ,这似乎是我正在搜索的内容,但是在 SQL 中。

    因此,根据答案的第一个解决方案,我尝试构建的查询将是这样的:
    select yt.id, yt.rev, yt.contents
    from YourTable yt
    inner join(
        select id, max(rev) rev
        from YourTable
        group by id
    ) ss on yt.id = ss.id and yt.rev = ss.rev
    

    有人知道如何在 Doctrine DQL 中制作它吗?

    现在,这是我的测试代码(不工作):
    $qb2= $this->createQueryBuilder('ms')
                ->select('ms, MAX(m.periodeComptable) maxPeriode')
                ->where('ms.affaire = :affaire')
                ->setParameter('affaire', $affaire);
    
    $qb = $this->createQueryBuilder('m')
                ->select('m')
                //->where('m.periodeComptable = maxPeriode')
    
                // This is what I thought was the most logical way of doing it:
                ->innerJoin('GAAffairesBundle:MontantMarche mm, MAX(mm.periodeComptable) maxPeriode', 'mm', 'WITH', 'm.periodeComptable = mm.maxPeriode')
    
                // This is a version trying with another query ($qb2) as subquery, which would be the better way of doing it for me,
                // as I am already using this subquery elsewhere
                //->innerJoin($qb2->getDQL(), 'sub', 'WITH', 'm.periodeComptable = sub.maxPeriode')
    
                // Another weird try mixing DQL and SQL logic :/
                //->innerJoin('SELECT MontantMarche mm, MAX(mm.periodeComptable) maxPeriode ON m.periodeComptable = mm.maxPeriode', 'sub')
    
                //->groupBy('m')
                ->andWhere('m.affaire = :affaire')
                ->setParameter('affaire', $affaire);
    
        return $qb->getQuery()->getResult();
    

    Entity是GAAffairesBundle:MontantMarche,所以这段代码在对应仓库的一个方法中。

    更一般地说,我正在学习如何处理高级查询的子查询(SQL 和 DQL)和 DQL 语法。

    谢谢!

    最佳答案

    经过几个小时的头痛和谷歌搜索和stackOverflow读数......
    我终于知道如何制作了。

    这是我的最终 DQL queryBuilder 代码:

        $qb = $this->createQueryBuilder('a');
        $qb2= $this->createQueryBuilder('mss')
                ->select('MAX(mss.periodeComptable) maxPeriode')
                ->where('mss.affaire = a')
                ;
    
        $qb ->innerJoin('GAAffairesBundle:MontantMarche', 'm', 'WITH', $qb->expr()->eq( 'm.periodeComptable', '('.$qb2->getDQL().')' ))
            ->where('a = :affaire')
            ->setParameter('affaire', $affaire)
            ;
    
        return $qb->getQuery()->getResult();
    

    关于php - DQL选择具有一列MAX值的每一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29962725/

    10-15 22:13