如何在以下查询中使用DoctrineDBAL正确准备参数?

时间:2015-01-05 16:44:32

标签: php sql-server doctrine-orm prepared-statement

我需要获取field列中每个可能值的百分比,超过表格的value

我发现了两种在SQL中获取结果的方法:

SELECT m.field, sum(m.value) * 100 / t.total
FROM my_table AS m 
    CROSS JOIN (
        SELECT SUM(value) AS total FROM 
        WHERE year = 2000) t
WHERE m.year = 2000
GROUP BY m.field, t.total

SELECT m.field, sum(m.value) * 100 / (SELECT SUM(value) AS total FROM WHERE year = 2000)
FROM my_table AS m 
WHERE m.year = 2000
GROUP BY m.field

但两者都是嵌套查询,我不知道如何使用Doctrine的QueryBuilder为嵌套查询准备语句。

有办法吗?

2 个答案:

答案 0 :(得分:1)

我一直试图使用querybuilder和DQL这样做但没有成功。看起来,DQL不允许在SELECT中使用子查询进行操作。到目前为止我取得的成就:

$subQuery = $em->createQueryBuilder('m')
                ->select("SUM(m.value)")
                ->where("m.year = 2000")
                ->getDQL();

以下查询有效但不计算百分比:

$query = $em->createQueryBuilder('f')
                ->select("f.field")
                ->addSelect(sprintf('(%s) AS total', $subQuery))
                ->addSelect('(SUM(f.value)*100) AS percentage')
                ->where("f.year = 2000")
                ->groupBy("f.field")
                ->getQuery()
                ->getResult();

但是,如果您尝试在select中添加除法以获取百分比并使用子查询,则它根本不起作用。看起来像DQL中不允许的构造。我已尝试使用别名并直接使用子查询,但它们都没有工作。

不起作用:

$query = $em->createQueryBuilder('f')
                    ->select("f.field")
                    ->addSelect(sprintf('(%s) AS total', $subQuery))
                    ->addSelect('(SUM(f.value)*100)/total AS percentage')
                    ->where("f.year = 2000")
                    ->groupBy("f.field")
                    ->getQuery()
                    ->getResult();

也不起作用:

$query = $em->createQueryBuilder('f')
                    ->select("f.field")
                    ->addSelect(sprintf('(SUM(f.value)*100)/(%s) AS percentage', $subQuery))
                    ->where("f.year = 2000")
                    ->groupBy("f.field")
                    ->getQuery()
                    ->getResult();

我建议直接使用SQL(Doctrine允许它)。使用本机SQL查询并映射结果可以解决问题。这样做没有缺点。

Documentation

如果你找到使用queryBuilder或DQL的方法,请告诉我。

希望它有所帮助。

答案 1 :(得分:0)

是的!解决方案是:

 $qs = $this
    ->createQueryBuilder('h');
    $d = $qs ->select($qs->expr()->count('h'));
    $e =  $d->getQuery()->getScalarResult();
    $qs->addSelect('(COUNT(h.id)*100 / :t) AS percentage')->setParameter('t', $e);
    $qs->addGroupBy(sprintf('h.%s', $type));
    return $qs->getQuery()->getResult();