我尝试发出 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。
致以诚挚的问候
在纯 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,因为这就是查询所做的。