假设我有三个表,一个用户表,一个包含大约 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/