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。
这是我的 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。