php - DQL 选择具有一列 MAX 值的每一行

标签 php sql-server symfony doctrine-orm greatest-n-per-group

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

现在,我在两个查询中这样做:

  • 一个获取表中列的最大值
  • 然后我选择具有该值的行。

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

搜索,我在 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/

相关文章:

sql-server - 如何在 SQL Server 中使 LIKE '%Search% 更快

symfony - 模板渲染过程中抛出异常

php - 存储未注册客户用户的信息

c# - 估计从 SQL 返回的数据集的大小

PHP MYSQL - 下拉选择依赖于先前的下拉菜单

SQL:查找字段值不同的行

php - HWIOAuthBundle 第一个示例的问题

symfony - 如何在已部署的 SF4 应用程序上处理环境变量

php - 从 php 函数中检索额外变量

php - 如何防止我的网站使用 php 在 iframe 中加载