当前位置: 首页 > 面试题库 >

symfony2-主义-如何使用计数和分组依据进行多重选择

习狐若
2023-03-14
问题内容

在Symfony2和Doctrine中,我想执行一个返回计数和分组依据的查询。

这是我尝试过的。这是我要运行的SQL:

SELECT   `terrain_id` , COUNT( * ) 
FROM     `Partie` 
WHERE     1 =1
GROUP BY `terrain_id`

与我的实体:

class Partie
{   
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Gp\UserBundle\Entity\User", 
        inversedBy="parties",         cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="Gp\JeuxBundle\Entity\Terrain")
     */
    private $terrain;

这是我的PartieRepository

public function getTest(\Gp\UserBundle\Entity\User $user){
    return $this->createQueryBuilder('p')
    ->select('count(p), p.terrain')
    ->where('p.user = :user')
    ->setParameter('user', $user)
    ->groupBy('r.terrain')
    ->getQuery()
    ->getResult();
}

这是我得到的错误:

[Semantical Error] line 0, col 19 near 'terrain FROM': Error: 
Invalid PathExpression.   Must be a StateFieldPathExpression.

问题答案:

您可能要使用本机查询

$sql = "SELECT terrain_id as terrain,
                count(*) AS count "
            ."FROM Partie "
            ."GROUP BY terrain_id;";


$rsm = new ResultSetMapping;
$rsm->addScalarResult('terrain', 'terrain');
$rsm->addScalarResult('count', 'count');
$query = $this->_em->createNativeQuery($sql, $rsm);
return $query->getResult();

只需根据需要添加任何具有/ where子句。

以下是我的结果:

Array
(
    [0] => Array
        (
            [terrain] => 
            [count] => 7
        )

    [1] => Array
        (
            [terrain] => 1
            [count] => 5
        )

    [2] => Array
        (
            [terrain] => 2
            [count] => 1
        )

)

terrain一个数组中缺少的原因是null terrain_id

编辑

OP产生了意外的结果,因此这是一些故障排除步骤:

1)在语句 前*
尝试var_dump($query->getSQL());正确的操作,然后直接对您的数据库运行SQL。如果这产生不正确的结果,请检查查询并适当更改。


*return``$sql

2)如果#1产生正确的结果,请在return语句 之前*
尝试var_dump($query->getResult());右移。如果这产生正确的结果,则说明您的代码中有更深层的内容。现在该看看为什么被过滤了。它可能与删除和更改SQL和中的别名一样简单。

*terrain``addScalarResult

3)尝试一个更简单的功能:

    $sql = "SELECT distinct(terrain_id) FROM Partie;";

    $rsm = new ResultSetMapping;
    $rsm->addScalarResult('terrain_id', 'terrain_id');
    $query = $this->_em->createNativeQuery($sql, $rsm);
    var_dump($query->getSQL());
    var_dump($query->getResult());
    return $query->getResult();


 类似资料:
  • 问题内容: 如何加快用? 它太慢并且经常使用。 我用很大的麻烦,并具有300多万行的表。 Relation_title , object_title 为varchar。 其中Relation_title =’XXXX’ ,返回超过1,000,000行,导致 object_title 上的索引 无法正常工作。 问题答案: 为了提高难度,我尝试了以下几种方法: (更轻松) - 确保您具有正确的覆盖指数

  • 问题内容: 我有一个看起来像这样的模型: 我想要为每个类别选择项目的计数(只是计数),因此在SQL中,它会像这样简单: 有没有相当于做这种“ Django方式”?还是纯SQL是唯一的选择?我熟悉Django中的count()方法,但是我看不出group by如何适合那里。 问题答案: 正如我刚刚发现的,这里是如何使用Django 1.1聚合API进行此操作:

  • 我有一个数据帧,我想按两个参数分组(1)相同的第一列中的连续编号和(2)第二列中的匹配值 数据帧: 组1包括前2行,因为30和31是连续的,第二列匹配。创建组2是因为Col1中的31和35不是连续的。创建组3是因为H和E不匹配。 在pandas groupby中对列表中的行进行分组 我很感谢你给我的建议

  • 问题内容: 我有如下的SQL: 并得到结果: 我想总结每个部门的学生人数,如下所示: 我该如何编写sql? 问题答案: 尽管您似乎并未显示所有表格,但我只能假设还有每位学生的实际入学表格 如果您想要与每个学生相关联的每个部门的总数(这没有意义),则可能必须这样做… 我对“姓名”列的解释是学生的姓名,而不是班级实际讲师的姓名,因此,我进行子选择/加入。否则,就像其他人一样,只需要使用COUNT(*)

  • 场景是,对于特定的日期范围,我需要返回字段值已更改(从和到日期)的所有行。更改后的字段值将以不同的颜色显示在屏幕上。 我可以返回特定时间段内发生更改的所有员工记录。但是,如果一个员工的记录在所选时间段内多次更改,我需要返回一个员工记录,并为每个不同的列返回一个组合值。1表示已发生更改,0表示未发生更改。 表DDL为: 模拟数据是: 我的疑问是: 在最后一个查询中,我将添加以下行以返回当前记录。我省

  • 问题内容: 我正在尝试转换此查询(已经可以使用) 对于Linq to SQL,但我不知道自己在做什么错。看我的尝试 我只需要对建筑物进行分组并计算每个建筑物有多少用户。 问题答案: 只需使用以下方法: