选择包含所有指定值的元素

a14dhokn  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(342)

我正在搜索有助于查询相关代码的条令函数:

select pt.product_id from product_taxon pt
    join product_taxon pt2 on pt.product_id=pt2.product_id and pt2.taxon_id = 101
where pt.taxon_id = 47;

这意味着选择所有具有id为101的分类单元和id为47的分类单元的元素,换句话说,同时具有分类单元101和47。
我尝试使用in(),但它选择的元素只能有47个和101个分类单元id中的一个。

uplii1fm

uplii1fm1#

一种典型的方法是使用聚合:

SELECT
    pt.product_id
FROM product_taxon pt
INNER JOIN product_taxon pt2
    ON pt.product_id = pt2.product_id
WHERE pt2.taxon_id IN (101, 47)
GROUP BY pt.product_id
HAVING COUNT(DISTINCT pt2.taxon_id) = 2;
ntjbwcob

ntjbwcob2#

感谢@tim biegeleisen,成功地将其转换为条令querybuilder:

$queryBuilder = $this->createQueryBuilder('o')
// fluent methods with conditions which are not related to problem
->setParameter('locale', $locale)
->setParameter('channel', $channel);

$in = $this->createQueryBuilder('k')
    ->select('pt5.id')
    ->leftJoin('k.productTaxons', 'pt4')
    ->innerJoin('k.productTaxons', 'pt3')
    ->leftJoin('pt4.product', 'pt5')
    ->andWhere('pt3.taxon IN (:taxons)')
    ->addGroupBy('pt4.id')
    ->having('COUNT(DISTINCT pt3) = :count')
;

$queryBuilder
    ->andWhere(
        $queryBuilder->expr()->in('o.id', $in->getDQL())
    )
    ->setParameter('count', count($taxonsArr))
    ->setParameter('taxons', $taxonsArr);

相关问题