小编Eld*_*mir的帖子

跨多对多关系查询“全部”

想象一下三个表的设置,User、Group 和 UserGroup,其中 UserGroup 由指向每个 User 和 Group 表的简单外键组成。

User
----
id
name

Group
-----
id
name

UserGroup
---------
user_id
group_id
Run Code Online (Sandbox Code Playgroud)

现在,我想编写一个查询,选择所有指定组中的所有用户。例如,从用户是“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)
)
Run Code Online (Sandbox Code Playgroud)

这将为每次调用产生一个连接.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
Run Code Online (Sandbox Code Playgroud)

如果我要查询一个更大的集合来匹配,这会变得有点麻烦。

那么有什么更好的方法来做到这一点呢?如果我要问“任何”而不是“所有”,如果是一个简单的问题

SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql relational-division many-to-many

5
推荐指数
1
解决办法
5014
查看次数

选择行并添加它们之前的行

我有一个表结构,用于保存另一个表的历史数据。就像是

id      | name        | date
----------------------------------------
1       | John        | 2016-01-01 14:38.123123
1       | John Smith  | 2016-01-03 16:46.123123
2       | ...         | 2016-01-01 14:38.123123
3       | ...         | 2016-01-01 14:38.123123
Run Code Online (Sandbox Code Playgroud)

我想做一个查询来获取每一行,并且对于每一行,还获取具有相同 ID 的前一行(行日期之前的最新日期),例如类似

SELECT id, name, date, previous.id, previous.name, previous.date
FROM ..?
Run Code Online (Sandbox Code Playgroud)

这可能吗?这是一个非常普遍的问题,但在我的特定情况下,我使用的是 PostgreSQL,所以如果有一些 postgres 功能可以实现这一点,那很好。

postgresql

3
推荐指数
1
解决办法
3147
查看次数