Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DQL选择具有一列最大值的每一行_Php_Sql Server_Symfony_Doctrine Orm_Greatest N Per Group - Fatal编程技术网

Php DQL选择具有一列最大值的每一行

Php DQL选择具有一列最大值的每一行,php,sql-server,symfony,doctrine-orm,greatest-n-per-group,Php,Sql Server,Symfony,Doctrine Orm,Greatest N Per Group,使用Symfony 2和Doctrine,我正在寻找一种方法来选择特定列中具有最大值的每一行 现在,我在两个查询中执行此操作: 一个用于获取表中列的最大值 然后选择具有此值的行。 我相信这可以通过一个查询完成 搜索,我在中发现,这似乎是我正在搜索的,但在SQL中 因此,根据答案的第一个解决方案,我试图构建的查询如下: select yt.id, yt.rev, yt.contents from YourTable yt inner join( select id, max(rev) re

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

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

一个用于获取表中列的最大值 然后选择具有此值的行。 我相信这可以通过一个查询完成

搜索,我在中发现,这似乎是我正在搜索的,但在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
有人知道如何在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();
实体是gaafairesbundle:MontantMarche,因此此代码位于相应存储库的方法中

更一般地说,我正在学习如何处理子查询SQL&DQL以及高级查询的DQL语法


谢谢

当我尝试进行子查询时,我会:

->andWhere($qb->expr()->eq('affaire', $qb2->getDql()));

经过几个小时的头痛,谷歌和堆栈溢出阅读。。。 我终于知道怎么做了

以下是我的最终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();

要使用纯DQL实现这一点,而不使用任何聚合函数,您可以将条令查询编写为

SELECT a
FROM GAAffairesBundle:MontantMarche a
    LEFT JOIN GAAffairesBundle:MontantMarche b
    WITH a.affaire = b.affaire 
    AND a.periodeComptable < b.periodeComptable
WHERE b.affaire IS NULL
ORDER BY a.periodeComptable DESC
这里我假设表e.gMontantMarche中的每个affaire都有多个条目,所以这里我尝试在affaire上进行自连接,而连接中的另一个调整是我尝试只连接右表b中的行,其中a的periodaccomptable 同样,使用带有内部联接的已发布示例查询也可以编写为

select yt.id, yt.rev, yt.contents
from YourTable yt
left join YourTable ss on yt.id = ss.id and yt.rev < ss.rev
where ss.rev is null

希望它有意义

谢谢@Charlie Lucas,但这一个对我没有什么帮助。@Cedo也许这是您需要的leftJoin不,我有一个DQL语法错误类型SELECT不是一个类。。。。所以整个查询语法都不正确。你好,Khalid,谢谢你的回答,很抱歉耽误了我的时间。这很有趣。不过有点奇怪。你能解释一下这里的逻辑吗?那你是怎么找到的??我很好奇b.PeriodCompetable的值是多少,其中b.affaire为空。。当我们询问a.affaire=b.affaire和b.affaire为NULL的元素时,它如何返回任何内容??因为没有元素montantMarche具有affaire NULL。此外,我认为您在这里遗漏了要点:我正在搜索特定Affaire中的所有“顶级”元素montantMarches。您似乎没有在查询中绑定任何Affaire.id。@Cedo我已更新了答案,以澄清DQL及其等效SQL的作用,为了更好地理解,您可以为表结构提供示例数据,这样我就可以使用示例数据集添加详细信息。此线程的可能副本不是其他线程的副本。首先是因为我的帖子是在将近3年前发布的,这会使另一个成为可能的副本,而且因为在我的例子中,我正在搜索一组具有字段最大值的连接元素,而在另一个线程上,作者似乎是在直接搜索一组元素,这些元素对于具有相同名称的每组元素都有一个字段的最大值。
select yt.id, yt.rev, yt.contents
from YourTable yt
left join YourTable ss on yt.id = ss.id and yt.rev < ss.rev
where ss.rev is null