使用where子句分组,其中两个表达式必须正确?

时间:2015-10-30 08:57:33

标签: php mysql doctrine

我有一个表productsartistsartist_product。产品来自多位艺术家是可能的,因此artist_product表会说

id = 1
product_id = 1
artist_id = 1

id = 2
product_id = 1
artist_id = 2

我现在想要的是获得由同一艺术家制作的所有产品。所有来自Artist 1Artist 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中创建查询,但我甚至不能正确查询。

1 个答案:

答案 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;