我有一个表products
,artists
和artist_product
。产品来自多位艺术家是可能的,因此artist_product
表会说
id = 1
product_id = 1
artist_id = 1
id = 2
product_id = 1
artist_id = 2
我现在想要的是获得由同一艺术家制作的所有产品。所有来自Artist 1
和Artist 2
但不是其他人(例如第3位艺术家)的产品
让我们说我有艺术家1和艺术家2,如同#34;表"以上解释。我正在查看ID为1的产品。现在我希望所有其他产品都是由相同的艺术家(例如产品2,3,4等),但不是来自其他艺术家,而不是当前的产品。
我写了这个查询
SELECT p.title, ap.product_id
FROM artist_product ap
INNER JOIN product p ON p.id = ap.product_id
GROUP BY product_id
HAVING COUNT(*) > 1;
现在我得到的所有产品都有多位艺术家,对吗?但问题是,我现在只从多位艺术家那里获得产品,我现在也需要检查艺术家。我不能artist_id = x AND artist_id = x
,因为因为小组的原因我不会工作,而且我也不能artist_id = x OR artist_id = x
,因为这不会是一样的。
我需要解决这个问题,还需要知道如何在Doctrine中解决这个问题?我目前没有ArtistProduct
的课程,我需要创建一个并且这样做吗?
$qb = $em->getRepository('\namespace\Product')->createQueryBuilder('p');
$artists = $this->getArtists();
$qb->innerJoin('ap.artist_product', 'a', 'WITH', 'a.id IN (:artists)')
->setParameter('artists', $this->getArtists())
->setMaxResults(12);
$qb->andWhere('p.id != ' . $this->getId());
return $qb->getQuery()->getResult();
这看起来并不正确,这里肯定有一些我不想要的东西。通常情况下,我会首先在SQL中创建查询,然后在Doctrine中创建查询,但我甚至不能正确查询。
答案 0 :(得分:1)
SELECT p.id, p.title, ap2.product_id, count(*) c
-- first select what we want - product
FROM product p
-- it must have both artists
INNER JOIN artist_product ap
ON p.id = ap.product_id AND ap.artist_id IN (?, ?)
-- catch any other artist
LEFT JOIN artist_product ap2
ON p.id = ap2.product_id AND ap2.artist_id NOT IN (?, ?)
GROUP BY p.id
-- and exclude the product, if it has one
HAVING ap2.product_id IS NULL
-- there must also be exactly 2 artists
AND c = 2;