在应用于一对多关系的过滤器上查询用户 table postgresql
Query users on filter applied to a one-to-many relationship table postgresql
我们目前有一个 users
table 与一个名为 steps
的 table 有 one-to-many
关系。每个用户可以有四个步骤或七个步骤。 steps
table 架构如下:
id | user_id | order | status
-----------------------------
# | # |1-7/1-4| 0 or 1
我正在尝试查询所有步骤状态为 1
的所有用户。因此,如果它们有 4 个或 7 个步骤,则它们的状态都必须为 1。
我尝试了在第 4 步进行检查的加入(因为如果前一个步骤也没有完成,一个步骤就无法完成)但是如果有 7 个步骤的人完成了第 4 步而不是第 7 步,这就会出现问题。
select u.first_name, u.last_name, u.email, date(s.updated_at) as completed_date
from users u
join steps s on u.id = s.user_id
where s.order = 4 and s.status = 1;
bool_and
聚合函数应该可以帮助您识别所有步骤都处于状态 = 1 的用户,无论步骤数是多少。
然后 array_agg
聚合函数可以帮助找到与每个用户的最后一步关联的 updated_at
日期,方法是根据 order DESC
对日期进行排序并选择中的第一个值结果数组 [1]
:
SELECT u.first_name, u.last_name, u.email
, s.completed_date
FROM users u
INNER JOIN
( SELECT user_id
, (array_agg(updated_at ORDER BY order DESC))[1] :: date as completed_date
FROM steps
GROUP BY user_id
HAVING bool_and(status :: boolean) -- filter the users with all their steps status = 1
) AS s
ON u.id = s.user_id
我们目前有一个 users
table 与一个名为 steps
的 table 有 one-to-many
关系。每个用户可以有四个步骤或七个步骤。 steps
table 架构如下:
id | user_id | order | status
-----------------------------
# | # |1-7/1-4| 0 or 1
我正在尝试查询所有步骤状态为 1
的所有用户。因此,如果它们有 4 个或 7 个步骤,则它们的状态都必须为 1。
我尝试了在第 4 步进行检查的加入(因为如果前一个步骤也没有完成,一个步骤就无法完成)但是如果有 7 个步骤的人完成了第 4 步而不是第 7 步,这就会出现问题。
select u.first_name, u.last_name, u.email, date(s.updated_at) as completed_date
from users u
join steps s on u.id = s.user_id
where s.order = 4 and s.status = 1;
bool_and
聚合函数应该可以帮助您识别所有步骤都处于状态 = 1 的用户,无论步骤数是多少。
然后 array_agg
聚合函数可以帮助找到与每个用户的最后一步关联的 updated_at
日期,方法是根据 order DESC
对日期进行排序并选择中的第一个值结果数组 [1]
:
SELECT u.first_name, u.last_name, u.email
, s.completed_date
FROM users u
INNER JOIN
( SELECT user_id
, (array_agg(updated_at ORDER BY order DESC))[1] :: date as completed_date
FROM steps
GROUP BY user_id
HAVING bool_and(status :: boolean) -- filter the users with all their steps status = 1
) AS s
ON u.id = s.user_id