Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm 条令联接查询以获取大于1的所有记录_Doctrine Orm_Createquery - Fatal编程技术网

Doctrine orm 条令联接查询以获取大于1的所有记录

Doctrine orm 条令联接查询以获取大于1的所有记录,doctrine-orm,createquery,Doctrine Orm,Createquery,我尝试使用普通的sql查询 SELECT activity_shares.id FROM `activity_shares` INNER JOIN (SELECT `activity_id` FROM `activity_shares` GROUP BY `activity_id` HAVING COUNT(`activity_id`) > 1 ) dup ON activity_shares.activity_id = dup.activity_id 这给了我记录id说10和11

我尝试使用普通的sql查询

SELECT activity_shares.id FROM `activity_shares` 
INNER JOIN (SELECT `activity_id` FROM `activity_shares`
GROUP BY `activity_id`
HAVING  COUNT(`activity_id`) > 1 ) dup ON activity_shares.activity_id = dup.activity_id
这给了我记录id说1011

但我在《条令查询生成器》中尝试过的相同查询

 $qb3=$this->getEntityManager()->createQueryBuilder('c')
           ->add('select','c.id')
           ->add('from','MyBundleDataBundle:ActivityShare c')
           ->innerJoin('c.activity', 'ca')
         //  ->andWhere('ca.id = c.activity')
           ->groupBy('ca.id')
          ->having('count(ca.id)>1');
编辑:

        $query3=$qb3->getQuery();
        $query3->getResult();
生成的SQL是:

SELECT a0_.id AS id0 FROM activity_shares a0_ 
INNER JOIN activities a1_ ON a0_.activity_id = a1_.id 
GROUP BY a1_.id HAVING count(a1_.id) > 1
只给出一条10的记录。我想两条都要。我不知道哪里出错了。知道吗

我的表格结构是:

ActivityShare
    +-----+---------+-----+---
    | Id  |activity |Share| etc...
    +-----+---------+-----+----
    | 1   | 1       |1    |
    +-----+---------+-----+---
    | 2   | 1       | 2   |
    +-----+---------+-----+---
活动
活动
表的外键。 我想获取Id的1和2

简化SQL 首先,让我简化该查询,使其得到相同的结果:

SELECT id FROM `activity_shares` 
GROUP BY `id`
HAVING  COUNT(`activity_id`) > 1 
造船工 如果您像sql建议的那样在表中存储活动的id: 您可以使用简化SQL生成查询:

$results =$this->getEntityManager()->createQueryBuilder('c')
           ->add('select','c.id')
           ->add('from','MyBundleDataBundle:ActivityShare c')
           ->groupBy('c.id')
           ->having('count(c.activity)>1');
           ->getResult();
如果使用关联表(条令逻辑) 在这里,您必须使用join,但计数可能很复杂

解决方案1

像使用实体一样使用关联表(在我看来,您只需要id) 假设表名为activityshare\u activity

它将有两个字段activity_id和activityshare_id,如果您想办法向该表中添加一个新的列id并使其自动递增+主,那么其余的就很简单了:

正在调用的新实体ActivityShareActivity

$results =$this->getEntityManager()->createQueryBuilder('c')
           ->add('select','c.activityshare_id')
           ->add('from','MyBundleDataBundle:ActivityShareActivity c')
           ->groupBy('c.activityshare_id')
           ->having('count(c.activity_id)>1');
           ->getResult();
添加新标识列以使其与条令兼容的步骤(您需要执行一次):

  • 添加列(INT,非NULL)还不要放入自动增量

    ALTER TABLE tableName ADD id INT NOT NULL

  • 使用类似for的php循环填充列

  • 将列修改为自动增量

    ALTER TABLE tableName MODIFY id INT NOT NULL自动增量

  • 解决方案2

    对你的问题的更正

    $result=$this->getEntityManager()->createQueryBuilder()
               ->select('c.id')
               ->from('MyBundleDataBundle:ActivityShare', 'c')
               ->innerJoin('c.activity', 'ca')
               ->groupBy('c.id') //note: it's c.id not ca.id
               ->having('count(ca.id)>1')
               ->getResult();
    

    我最后发布了这篇文章,因为我不能100%确定have+count的输出,但它应该很好:)

    谢谢你的回答。我终于得到了答案

    我的问题是:

    $subquery=$this->getEntityManager()->createQueryBuilder('as')
          ->add('select','a.id')
          ->add('from','MyBundleDataBundle:ActivityShare as')
          ->innerJoin('as.activity', 'a')
          ->groupBy('a.id')
          ->having('count(a.id)>1');
    
    
    
     $query=$this->getEntityManager()->createQueryBuilder('c')
          ->add('select','c.id')
          ->add('from','ChowzterDataBundle:ActivityShare c')
          ->innerJoin('c.activity', 'ca');
    
        $query->andWhere($query->expr()->in('ca.id', $subquery->getDql()))
          ;
    
        $result = $query->getQuery();
        print_r($result->getResult());
    
    SQL看起来像:

    SELECT a0_.id AS id0 FROM activity_shares a0_ INNER JOIN activities a1_ ON a0_.activity_id = a1_.id WHERE a1_.id IN (SELECT a2_.id FROM activity_shares a3_ INNER JOIN activities a2_ ON a3_.activity_id = a2_.id GROUP BY a2_.id HAVING count(a2_.id) > 1
    

    您要执行什么来获取结果?必须有一行,如
    $query->getResult()
    来检索实体。如果你有什么
    $query->getSingleResult()
    你只会得到一行。我已经编辑了这个问题。请参考。看起来不错。尝试
    $query3->getSql()
    获取SQL字符串,并使用MySql客户端将其直接执行到数据库中。看看你是否得到了相同的结果。是的。它只给出了一个记录。结果我得到了一个记录的正确Id。但是我想要两个记录Id。我在MySql客户端尝试的上面的常规sql查询。它给了我两个记录Id。谢谢你的回答。你的简化查询将只给出一个记录Id。假设有两个Id为1和2的记录满足条件计数>1。它将只给我第一个记录Id 1。我想要两者。我猜
    groupBy
    应该在活动Id上,而不是活动共享表Id上。