QueryBuilder-IN表达式

时间:2019-01-25 10:18:35

标签: sql symfony doctrine query-builder

我创建了一个测验,并在DB中记录了人们是否正确回答了所有问题以及完成测验所花费的时间。

我正在尝试创建一个querybuilder来检索能够在最短的时间内回答尽可能多的正确问题的人。

我的桌子看起来像这样: enter image description here

因此,我在数据库中的SQL中执行的请求(有效)是:

SELECT 
  id
FROM
  public.user_quizz
WHERE 
  quizz_id = 4
  AND 
    number_correct_answers IN (SELECT max(number_correct_answers) FROM user_quizz WHERE quizz_id = 4)
  AND 
    answered_in IN (SELECT min(answered_in) FROM user_quizz WHERE quizz_id = 4);

当然,我不知道这是否是我们在这种情况下可以执行的最佳(和最佳)请求,但是它可以正常工作。

现在,我正在尝试将此查询转换为querybuilder。

我被 IN 表达式阻止。我不知道如何在这里进行选择。

$qb = $this->createQueryBuilder('u');

        $query = $qb->select('u')
            ->andWhere(
                $qb->expr()->eq('u.quizz', ':quizzId'),
                $qb->expr()->in(
                    'u.numberCorrectAnswers',

                )
            )
            ->setParameter('quizzId', $quizz->getId())
            ->getQuery()
        ;

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

$qbSelectMax = $this->createQueryBuilder('uc')  // user copy, to prevent alias collisions
$qbSelectMax
   ->select($qb->expr()->max('uc.numberCorrectAnswers'))
   ->where($qb->expr()->eq('uc.quizz', ':quizzId'));      

$qb = $this->createQueryBuilder('u')
$query = $qb->select('u')
    ->andWhere(
        $qb->expr()->eq('u.quizz', ':quizzId'),
        $qb->expr()->in(
            'u.numberCorrectAnswers',
            $qbSelectMax->getDQL()
        )
    )
    ->setParameter('quizzId', $quizz->getId())
    ->getQuery();

您可以创建子DQL查询,以首先选择最大numberCorrectAnswers,然后将DQL直接传递到in参数

答案 1 :(得分:0)

ORDER BY可用于按答案数量和较少的时间进行排序:

$qb = $this->createQueryBuilder('u')
   ->orderBy('u.numberCorrectAnswers', 'DESC')
   ->addOrderBy('u.answeredIn', 'ASC');