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
您可以使用group by和having:
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)
这假设数据和数组都没有重复项。可以对其进行调整来解决这个问题,但似乎不太可能解决此类问题。
| 归档时间: |
|
| 查看次数: |
927 次 |
| 最近记录: |