Mysql 查询其中多对多关系至少包含数组的所有值

问题描述 投票:0回答:1

我尝试发出 SQL 请求以获取包含类别数组的所有产品。 产品 ==ManyToMany== 类别

我选择类别 id 11 和 197,我需要找到所有具有这两个类别的产品。

SELECT
  DISTINCT p0_.id AS id_0,
  p0_.titre AS titre_1
FROM
  produit p0_
  LEFT JOIN produit_categorie_produit p2_ ON p0_.id = p2_.produit_id
  LEFT JOIN categorie_produit c1_ ON c1_.id = p2_.categorie_produit_id  
WHERE
   c1_.id IN (197, 11)
ORDER BY
  titre_1 ASC
LIMIT
  12;

这里 IN 是一个大问题,因为我从一个类别和其他类别中获得产品,但这不是我想要的。 经过几个小时的测试,我真的迷失在这里...... 我在 symfony 中使用学说,这里生成的 sql 请求是我的学说查询

$qb = $this->createQueryBuilder('p')->leftJoin('p.categories', 'c');
    $qb->addSelect('p.titre as titre');
    if ($value){
        $qb->andWhere('c in (:cat)')->setParameter('cat', $value );   
    }        
    return $qb->getQuery();

我删除了一些没有重要信息的addSelect。

致以诚挚的问候

mysql arrays doctrine
1个回答
0
投票

在纯 SQL 中,您通常会使用

group by
having
来确保您选择的产品具有两个类别:

SELECT p0_.id AS id_0, p0_.titre AS titre_1
FROM produit p0_
INNER JOIN produit_categorie_produit p2_ ON p0_.id = p2_.produit_id
INNER JOIN categorie_produit c1_ ON c1_.id = p2_.categorie_produit_id  
WHERE c1_.id IN (197, 11)      -- any of the two categories
GROUP BY p0_.id, p0_.titre
HAVING COUNT(*) = 2            -- both match
ORDER BY titre_1
LIMIT 12;

如果给定产品的同一类别可能出现两次,那么您需要

COUNT(DISTINCT c1_.id)
代替。

请注意,我将

LEFT JOIN
s 更改为
INNER JOIN
s,因为这就是查询所做的。

© www.soinside.com 2019 - 2024. All rights reserved.