sql - 多对多关系中的 AND 条件

标签 sql postgresql indexing many-to-many relational-division

假设我有三个表,一个用户表,一个包含大约 500 个不同项目的表,以及相应的连接表。我想做的是:

select * from users u join items_users iu on iu.user_id = u.id
where iu.item_id in (1,2,3,4,5)
and u.city_id = 1 limit 10;

除了 IN 条件之外,我想找到拥有所有 相应项目的用户。如果有帮助,假设一次搜索的最大项目数为 5。此外,我使用的是 Postgres,如果有帮助,请不要介意对其进行非规范化,因为它是一个只读系统并且速度最高优先级。

最佳答案

这是关系划分的另一种情况。我们已经收集了大量的查询来处理这类问题 here .

在这种情况下,如果有 5 个或更多项,我可能会尝试:

SELECT u.*
FROM   users AS u
WHERE  u.city_id = 1
AND EXISTS (
   SELECT *
   FROM   items_users AS a
   JOIN   items_users AS b USING (user_id)
   JOIN   items_users AS c USING (user_id)
   ...
   WHERE  a.user_id = u.user_id
   AND    a.item_id = 1
   AND    b.item_id = 2
   AND    c.item_id = 3
   ...
   )
LIMIT 10;

它是我测试中最快的,它符合 items_users 的多个条件的要求,同时只返回来自 user 的列。

了解 indexes at the linked answer .这些对于性能至关重要。 因为你的表是只读的,所以我也会 CLUSTER两个表,以尽量减少必须访问的页面数。如果不出意外,CLUSTER items_users(user_id, item_id) 上使用多列索引。

关于sql - 多对多关系中的 AND 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333433/

相关文章:

sql - U-SQL:如何处理架构更改?

mysql - 如何使用自增列(字段)向MySQL插入数据?

java - Hibernate无法创建表: org. hibernate.tool.schema.spi.CommandAcceptanceException:执行DDL时出错“创建表PSQLException

python - 无法使用python从数据库中选择一千万行

mysql - 为什么 MySQL 会发出文件排序?

mysql - 获取多个表的 COUNT 总和

sql - 在 SQL 中连接三个表

c# - 使用 docker-compose 运行 docker 镜像

mysql - 索引大型 MySQL 表

wordpress - 指向停放域的内部链接 + SEO