Self JOIN SQL 转换为 Doctrine

Self JOIN SQL converting to Doctrine

这是我的 table:

假设我传递的 $cameras 包含相机 ID 30 和 31,我的结果应该是 70,它是 30(对于 ID 43,它是 camera_id 31 的最大 ID)和 40(ID 45 , 它是 camera_id 32)

的最大 ID

我可以用这个 SQL 语句实现这个结果:

SELECT SUM(t.number) 
FROM `count` t 
INNER JOIN 
  (SELECT MAX(id) id, camera_id 
   FROM`count` 
   WHERE camera_id 
   IN $cameras 
   GROUP BY camera_id)t1 
ON t1.id = t.id

但我想将此 SQL 语句转换为 Doctrine 的查询。这是我尝试的:

$this->createQueryBuilder("c")
            ->select('SUM(c.number)')
            ->innerJoin(Count::class, 'c2', 'WITH' , 'c.id = c2.id')
            ->select('MAX(c2.id)')
            ->where('c2.camera IN (:value)')
            ->setParameter('value', $cameras)
            ->groupBy('c2.camera')
            ->getQuery()
        

但是这个查询 returns 给我 Max ids 我想把这些 Max ids 返回给

->andWhere('SUM(c.number)')

他们应该相加的行。

如何调整查询代码?

非常感谢。

我找到的最简单的解决方案是使用第二个生成器:

$qb = $this->createQueryBuilder('c')
    ->select('MAX(c.id) AS max_id')
    ->where('c.camera IN (:cameras)')
    ->groupBy('c.camera');

$result = $this->createQueryBuilder('c2')
    ->select('SUM(c2.number)')
    ->where($qb->expr()->in('c2.id', $qb->getDQL()))
    ->setParameter('cameras', $cameras)
    ->getQuery()->getResult();

灵感来自 here