如何使用dql Doctrine querybuilder选择具有最早日期的行?

时间:2016-09-30 15:14:34

标签: symfony doctrine dql

我正在尝试计算用户回答Q& A网站上的问题所需的平均时间,例如SO。我正在使用Symfony和Doctrine。以下代码给出了结果,但它不是我要找的结果。它给出了所有答案的平均值,我希望它只给出第一个答案的平均值。

$qb = $this->getEntityManager()->createQueryBuilder();
$qb
    ->select('SUM(UNIX_TIMESTAMP(a.date) - UNIX_TIMESTAMP(q.date)) / COUNT(DISTINCT q.id)')
    ->from(Question::class, 'q')
    ->join('q.answer', 'a')
    ;
return $qb->getQuery()->getSingleScalarResult();

我尝试在MIN()周围投掷a.date,但是它给出了一个groupby错误。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您需要的是加入每个问题最旧的答案。您可以使用ON子句中的子查询

来实现这一点
SELECT AVG(UNIX_TIMESTAMP(answer.date) - UNIX_TIMESTAMP(question.date)) as avgFirstResponseTime
FROM question
INNER JOIN answer ON answer.id = (
    SELECT id 
    FROM answer 
    WHERE question_id = question.id
    ORDER BY date ASC
    LIMIT 1    
)

我注意到这种子查询是否适用于doctrines querybuilder或DQL。但是如果DQL不支持它,你可以使用$entityManager->createNativeQuery