sql >> データベース >  >> RDS >> Mysql

Symfony2-Doctrine2 QueryBuilder WHEREINManyToManyフィールド

    ソリューションには、COUNT(DISTINCT)を利用できます。 HAVING およびGROUP BY 条項

    public function findByServices($services)
    {
        $qb = $this->createQueryBuilder('hotel')
            ->addSelect('location')
            ->addSelect('country')
            ->addSelect('billing')
            ->addSelect('services')
            ->addSelect('COUNT(DISTINCT  services.id) AS total_services')
            ->innerJoin('hotel.billing', 'billing')
            ->innerJoin('hotel.location', 'location')
            ->innerJoin('location.city', 'city')
            ->innerJoin('location.country', 'country')
            ->innerJoin('hotel.services', 'services');
        $i = 0;
        $arrayIds = array();
        foreach ($services as $service) {
            $arrayIds[$i++] = $service->getId();
        }
        $qb->add('where', $qb->expr()->in('services', $arrayIds))
            ->addGroupBy('hotel.id')
            ->having('total_services = '.count($arrayIds))
            ->getQuery();
    }
    

    上記のクエリでは、ホテルごとに個別のサービスIDをカウントするために、もう1つselectを追加しました。つまり

    次に、そのカウントのグループ化も必要なので、

    を追加しました

    ここで、ID(1,2,3)などのすべてのサービスIDを持つホテルが必要であると述べたように、注意が必要な部分があります。したがって、これら3つのサービスを含むホテルは、where servid_id = 1 or servid_id = 2 servid_id = 3 これはまさにあなたがANDを望まないということです ホテルがこれらの3つを持っている必要があるという操作なので、私はパートを持ってこのロジックを変換しました

    total_services はクエリの仮想エイリアスであり、ホテルごとに異なるカウントを保持しているため、このカウントをIN()で提供されたIDのカウントと比較しました。 一部これは、これらのサービスを含まなければならないホテルを返します

    GROUP BY and HAVING Clause




    1. エラー1046データベースが選択されていません。解決方法を教えてください。

    2. MyISAMレコード構造を理解する

    3. PHPを使用して改行付きのテキスト文字列をMySQLデータベースのテキストフィールドに保存するにはどうすればよいですか?

    4. 単一のテキストエリアを使用してmysqlに複数の電子メールを挿入します