1

通常の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になります

しかし、私がやろうとしたのと同じクエリDoctrine query builder

 $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のレコードを1つだけ与えます。両方を取得したい。どこが間違っていたのかわからない。何か考えはありますか?

私のテーブル構造は次のとおりです。

ActivityShare
    +-----+---------+-----+---
    | Id  |activity |Share| etc...
    +-----+---------+-----+----
    | 1   | 1       |1    |
    +-----+---------+-----+---
    | 2   | 1       | 2   |
    +-----+---------+-----+---

ActivityActivityテーブルへの外部キーです。IDの1と2を取得したい

4

2 に答える 2

0

簡略化されたSQL

まず、同じ結果が得られるように、そのクエリを単純化してみましょう。

SELECT id FROM `activity_shares` 
GROUP BY `id`
HAVING  COUNT(`activity_id`) > 1 

Docrtrine QueryBuilder

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();

アソシエーションテーブルを使用している場合(Doctrineロジック)

ここではjoinを使用する必要がありますが、カウントには注意が必要な場合があります

解決策1

エンティティのように連想テーブルを使用します(私が見るように、IDのみが必要です)テーブル名がactivityshare_activityであるとしましょう

そのテーブルに新しい列IDを追加し、それを自動インクリメント+プライマリにする方法を見つけた場合、2つのフィールドactivity_idとactivityshare_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();

新しい識別列を追加して教義と互換性を持たせるための手順(これは一度行う必要があります):

  1. 列を追加します(INT、NOT NULL)まだ自動インクリメントを入れないでください

    ALTER TABLE tableName ADD id INT NOT NULL

  2. 次のようなphpループを使用して列にデータを入力します

  3. 自動インクリメントになるように列を変更します

    ALTER TABLE tableName MODIFY id INT NOT NULL AUTO_INCREMENT

Solution2

クエリの修正

$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%確実ではないので、これを最後に投稿しましたが、うまくいくはずです:)

于 2013-03-05T04:01:13.553 に答える
0

あなたの答えをありがとう。私はついに答えを得ることができました

私のDoctrineクエリは次のとおりです。

$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
于 2013-03-05T09:56:05.070 に答える