【问题标题】: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2013-08-07
    • 2015-04-17
    相关资源
    最近更新 更多