2013-07-25 31 views
0

我的问题是教义和SQL的GroupBy与顺序按Symfony的2学说:排序依据 - 的GroupBy最大元素与加入

那么一点点的描述有一家店(S),店内有篇(一)和有一个实体访问计数器(vc)来统计不同事物的访问量,也用于商店和文章。

我想要一个文章列表(热门文章),但只是每个商店访问量最大的文章。

class Shop { 
     private $id; 
     private $name; 
     private $is_published; 
     ... 
     /** 
     * OneToMany articles 
     */ 
     private $articles; 
    } 

    class Article { 
     private $id; 
     private $name; 
     private $is_published; 
     ... 
     /* ManyToOne Shop*/ 
     private $shop; 
    } 

    class VisitCounter { 
     private $id; 
     private $object_type; //0 for Article, 1 for Shop, 2 for Category 
     private $object_id; 
     ... 
     private $nr_alltime_visits; 
    } 

然后我试图与在文章库下面的查询:

$query = $this->createQueryBuilder('a', 's', 'vc') 
      ->select('a, s') 
      ->leftJoin('a.shop', 's') 
      ->leftJoin('ProjMyBundle:VisitCounter', 'vc', 'WITH', 'vc.object_type = 0 AND cs.object_id= a.id') 
      ->where('a.is_published = 1 AND s.is_published = 1) 
      ->orderBy('vc.nr_alltime_visits', 'DESC') 
      ->groupBy('a.shop'); 

但我并没有得到相应的文章预计,如果我删除该组由我得到正确的文章,但每个店铺超过1个。

任何想法?

这个问题,我在车间和第(私人$ nr_visits)字段,然后我有这样的事情(可以帮助别人的未来)之前:

$query = $this->createQueryBuilder('a', 's') 
        ->select('a, s') 
        ->where('a.is_published = 1 AND s.is_published = 1') 
        ->leftJoin('a.shop', 's') 
        ->groupBy('a.shop') 
        ->orderBy('nr_visits', 'DESC'); 


    $query->andWhere('a.nr_visits = (SELECT MAX(a2.nr_visits) as nr_visits2 FROM ProjMyBundle:Article AS a2 WHERE a2.is_published = 1 AND a2.shop=a.shop GROUP BY a2.shop)'); 

回答

0

这是可能的子查询像在旧版本:

$qb->select('a, s, cs')->leftJoin('a.shop', 's') 
     ->leftJoin('ProjMyBundle:VisitCounter', 'vc', 'WITH', 'vc.object_type = :object_type AND cs.object_id=a.id') 
     ->where('a.published = 1 AND s.published = 1) 
     ->andWhere('vc. nr_alltime_visits = (SELECT MAX(vc2.nr_alltime_visits) as hits2 FROM ProjMyBundle:Article AS a2 
          LEFT JOIN ProjMyBundle:VisitCounter AS vc2 WITH vc2.object_type = :object_type AND vc2.object_id = a2.id 
          WHERE a2.published = 1 v2.shop=v.shop GROUP BY v2.shop)') 
     ->setParameters(array('object_type' => Clicks::$TYPE_ARTICLE)) 
     ->orderBy('cs.nr_alltime_visits', 'DESC') 
     ->groupBy('v.shop')->getQuery()->getResult(); 
0

VisitCounter没有直接与商店或商品的关系,因为object_id列取决于object_type列。所以你不能使用学说的fetch-joins,因为它期望有一个直接的关系。你必须编写一些本地SQL,但你仍然可以使用一些教义的好东西来帮助你制作漂亮的对象(尽管数组是读取操作的首选)。

至于你的查询,你需要寻找的“按组前N位”,这是每个数据库平台上的不同(你没有在你的问题中指定)。您必须按文章(和商店)进行分组,然后在您汇总的行上执行COUNT(*)。

在这里你可以了解如何映射来自本地SQL结果:http://docs.doctrine-project.org/en/latest/reference/native-sql.html#examples

+0

感谢您的评论的问题在得到解决然后在查询内部完成一个新的dql。 $查询 - > andWhere('cs.visits_all_time =(/ *新的查询* / – felipep