【问题标题】:Symfony Query Builder (Subquery)Symfony 查询生成器(子查询)
【发布时间】:2020-11-24 10:24:24
【问题描述】:
此 SQL 查询在查询构建器中的外观如何?不幸的是,子选择是不可能的,对吧?
SQL:
SELECT t.* FROM domain_check_result AS t
INNER JOIN (SELECT *, MAX(checkDate) AS MaxDate
FROM domain_check_result
GROUP BY domain_id) AS tm ON t.domain_id = tm.domain_id AND t.checkDate = tm.MaxDate
【问题讨论】:
标签:
php
symfony
doctrine
greatest-n-per-group
query-builder
【解决方案1】:
要从您的组(域)中选择最新结果,您可以如下重写您的查询,这样在 DQL 和查询生成器中翻译此查询会更容易
SQL
SELECT
a.*
FROM
domain_check_result a
LEFT JOIN domain_check_result b
ON a.domain_id = b.domain_id
AND a.checkDate < b.checkDate
WHERE b.checkDate IS NULL
ORDER BY a.checkDate DESC
DQL
SELECT a
FROM AppBundle\Entity\DomainCheckResult a
LEFT JOIN AppBundle\Entity\DomainCheckResult b
WITH a.domain = b.domain
AND a.checkDate < b.checkDate
WHERE b.checkDate IS NULL
ORDER BY a.checkDate DESC
在查询中,您可以将 DQL 翻译为
$repo = $DM->getRepository( 'AppBundle\Entity\DomainCheckResult' );
$results = $repo->createQueryBuilder( 'a' )
->select( 'a' )
->leftJoin(
'AppBundle\Entity\DomainCheckResult',
'b',
'WITH',
'a.domain = b.domain AND a.checkDate < b.checkDate'
)
->where( 'b.checkDate IS NULL' )
->orderBy( 'a.checkDate','DESC' )
->getQuery()
->getResult();
Reference: Doctrine Query Language get Max/Latest Row Per Group