PostgreSQL - 获取与数组完全匹配的行

Eti*_*nne 3 sql postgresql many-to-many

我有一个colors表和一个items表,这两个表之间存在多对多items_colors关系(通过表)。一个项目可以有多种颜色,一种颜色可以有很多项目。并且没有重复的颜色。

items
   id

colors
   id
   name

items_colors
    item_id [foreign key: items(id)]
    color_id [foreign key: colors(id)]

Run Code Online (Sandbox Code Playgroud)
  • 如何获取具有指定颜色数组的所有项目?(不多也不少)

例如,我想获取所有具有蓝色 红色项目(如果它有另一种颜色或只有两种颜色之一,则必须忽略它)。

我仍然无法得到它......例如,下面的查询返回太多项目(例如,除了蓝色和红色之外还有其他颜色的项目)。

items
   id

colors
   id
   name

items_colors
    item_id [foreign key: items(id)]
    color_id [foreign key: colors(id)]

Run Code Online (Sandbox Code Playgroud)

这是解决我的问题的小提琴:https://dbfiddle.uk/?rdbms= postgres_13&fiddle=9de03c642da5b018d6f20b44bcf91876

Gor*_*off 5

您可以使用group byhaving

SELECT i.*
FROM items i JOIN
     items_colors ic
     ON ic.item_id = i.id JOIN
     colors c
     ON c.id = ic.color_id
GROUP BY i.id
HAVING COUNT(*) FILTER (WHERE c.name = ANY (ARRAY['blue', 'red'] ) ) = COUNT(*) AND
       COUNT(*) = CARDINALITY(ARRAY['blue', 'red']);
Run Code Online (Sandbox Code Playgroud)

这假设数据和数组都没有重复项。可以对其进行调整来解决这个问题,但似乎不太可能解决此类问题。