新手问题:NN连接匹配所有列表

Nic*_*nco 1 sql postgresql aggregate-functions

表格:

-- products --
   id

-- categories --
   id

-- products_categories --
   id
   product_id
   category_id
Run Code Online (Sandbox Code Playgroud)

什么是SQL查询,它返回与给定的category_ids列表匹配的所有产品ID?

示例:给定列表(3,4,5)我希望所有具有最少(可能更多)类别ID 3和类别ID 4以及类别ID 5的product_ids?

OMG*_*ies 6

使用:

  SELECT p.id
    FROM PRODUCTS p
    JOIN PRODUCTS_CATEGORIES pc ON pc.product_id = p.id
    JOIN CATEGORIES c ON c.id = pc.category_id
   WHERE c.id IN (3,4,5)
GROUP BY p.id
  HAVING COUNT(DISTINCT c.id) = 3
Run Code Online (Sandbox Code Playgroud)

这通常被称为Celko的分部.

COUNT(DISTINCT c.id)必须等于规定值的数量IN子句.否则,重复的4/3/5 /等将是误报.但是,如果所有对product_id, category_id都保证是唯一的,DISTINCT则可以省略.