在应用于一对多关系的过滤器上查询用户 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