想象一下三个表的设置,用户、组和用户组,其中用户组由每个用户和组表的简单外键组成。
User
----
id
name
Group
-----
id
name
UserGroup
---------
user_id
group_id
现在,我想编写一个查询,选择所有指定组中的所有用户。例如,从用户中选择 *,其中用户属于“group1”、“group2”和“group3”中的每一个。
使用 Django ORM 查询,我会做类似的事情
users = (
User.objects
.filter(user_group__group_id=group1.id)
.filter(user_group__group_id=group2.id)
.filter(user_group__group_id=group2.id)
)
这将为每次调用产生一个连接.filter
,例如
SELECT * FROM users
INNER JOIN user_group g1 ON g1.user_id = id
INNER JOIN user_group g2 ON g2.user_id = id
INNER JOIN user_group g3 ON g3.user_id = id
WHERE g1.group_id = %s
AND g2.group_id = %s
AND g3.group_id = %s
如果我要查询一个更大的集合来匹配,这会变得有点麻烦。
那么有什么更好的方法来做到这一点呢?如果我要问“任何”而不是“全部”,那将是一个简单的问题
SELECT * FROM users
INNER JOIN user_group g1 ON g1.user_id = id
WHERE g1.group_id in %s
但这不是我需要的。
一个小提示:我的具体环境是在 Postgres 上,所以这里没有花哨的 MSSql 东西可以帮助我。最好,答案应该足够通用,可以在任何 SQL 风格中使用。