Symfony 2 & Doctrine:选择计数并分组,返回错误结果



我有这样的表格

ID       |   ADKEY    |  IP       |  CREATED_AT
1        | NS0392DJEJ | 127.0.0.1 | 2016-04-25 09:00:00
2        | NS0392DJEJ | 127.0.0.1 | 2016-04-25 09:20:00
3        | UI0392DJPO | 127.0.0.1 | 2016-04-25 09:30:00

目标是每次有人点击网站上的广告时添加一个新行。

我的问题是当我想通过广告获取点击次数时(广告的名称是adkey列)

在我的示例中,我应该得到NS0392DJEJ ==> 2UI0392DJPO ==> 1

但是对于以下请求,计数始终为 1

首先,全局 getQueryBuilder()

 */
public function getQueryBuilder()
{
    $queryBuilder = $this->getEntityManager()->createQueryBuilder();
    $queryBuilder
        ->select('e')
        ->from($this->getEntityClass(), 'e')
        ->orderBy('e.id', 'DESC');
    return $queryBuilder;
}

然后,我在子类中扩展它

public function getQueryBuilder()
{
    $qb = parent::getQueryBuilder();
    $qb->addSelect( $qb->expr()->count('e.id') . 'as adCount');
    $qb->addGroupBy('e.adkey');
}

当我分析请求时,我注意到 Doctrine 发出了第一个请求来获取 id,然后使用这些 id 来执行计数请求

SELECT 
  DISTINCT id0 
FROM 
  (
    SELECT 
      a0_.id AS id0, 
      a0_.adkey AS adkey1, 
      a0_.ip AS ip2, 
      a0_.created_at AS created_at3, 
      COUNT(a0_.id) AS sclr4 
    FROM 
      advertiser_clickcounter a0_ 
    GROUP BY 
      a0_.adkey 
    ORDER BY 
      a0_.id DESC
  ) dctrn_result 
LIMIT 
  30 OFFSET 0

然后

SELECT 
  a0_.id AS id0, 
  a0_.adkey AS adkey1, 
  a0_.ip AS ip2, 
  a0_.created_at AS created_at3, 
  COUNT(a0_.id) AS sclr4 
FROM 
  advertiser_clickcounter a0_ 
WHERE 
  a0_.id IN (?) 
GROUP BY 
  a0_.adkey 
ORDER BY 
  a0_.id DESC
Parameters: [['5', '4', '2']] 

你有什么建议吗?正确的方法是什么?知道我需要一个 QueryBuilder 实例作为结果(或者如果您知道将查询转换为 QueryBuilder 实例的方法?

谢谢

你在那里做的事情本身看起来并没有错。不过,这是一个非常简单的查询分组,实际上不需要扩展任何类。不妨一击而出。

这将正常工作(我对你的实体可能被称为什么做了一些假设):

    $yourCount = $qb->select('count(a.adkey) as adKeyCount, a.adKey')
        ->from('YourBundle:YourAdKeyEntity', 'a')
        ->groupBy('a.adKey')
        ->getQuery()
        ->getResult();

选择 AdKey 实体是没有意义的,因为无论如何您只会获得其中一个分组实体。

相关内容

  • 没有找到相关文章

最新更新