Php DQL选择具有一列最大值的每一行
使用Symfony 2和Doctrine,我正在寻找一种方法来选择特定列中具有最大值的每一行 现在,我在两个查询中执行此操作: 一个用于获取表中列的最大值 然后选择具有此值的行。 我相信这可以通过一个查询完成 搜索,我在中发现,这似乎是我正在搜索的,但在SQL中 因此,根据答案的第一个解决方案,我试图构建的查询如下: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
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