2016-09-30 2 views
0

Я пытаюсь вычислить среднее время, которое требуется, чтобы пользователи отвечали на вопросы по Q & Сайт вроде SO. Я использую Symfony и Doctrine. Следующий код дает результат, но это не тот результат, который я ищу. Он дает среднее значение для ответов на все, и я хотел бы, чтобы он дал среднее значение только для первых ответов.Как выбрать строку с самой старой датой с помощью dql Doctrine querybuilder?

$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.

Как это сделать?

ответ

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  
) 

Я уверен, что если отметить этот вид подзапроса работает с доктринами QueryBuilder или DQL вообще. Но вы можете использовать $entityManager->createNativeQuery, если DQL не поддерживает его.