创建链接到另外2个表的表的聚合查询

时间:2019-06-11 11:39:31

标签: sql postgresql

我有3个表,第一个表存储有关用户的信息,例如电子邮件地址等,并且它会动态更新(当新用户注册时)。第二个存储用户的角色,它是来自init SQL脚本的静态表。最后一个名为user_status,它通过添加带有当前时间戳的新条目来跟踪更改特定用户的角色。

需要收集所有由role分组的用户的当前状态(最新创建的状态条目),该用户指向一个数字,该数字是对应用户的数量。

/* table user_account stores top user information */
CREATE TABLE IF NOT EXISTS user_account (
             id serial PRIMARY KEY,
             email text NOT NULL
);

/* table user_role keeps user's role ids */
CREATE TABLE IF NOT EXISTS user_role (
             id serial PRIMARY KEY,
             role text NOT NULL
);

/* table user_status track a user role on change */
CREATE TABLE IF NOT EXISTS user_status (
             id serial PRIMARY KEY,
             user_account_id int NOT NULL REFERENCES user_account(id),
             user_role_id int NOT NULL REFERENCES user_role(id),
             created timestamptz NOT NULL DEFAULT clock_timestamp()
);

INSERT INTO user_account(email) VALUES
( 'user1@myorg.com' ),
( 'user2@myorg.com' ),
( 'user3@myorg.com' );

INSERT INTO user_role (role) VALUES
( 'activation_required' ),
( 'regular' ),
( 'forum_only' ),
( 'moderator' ),
( 'admin' );

INSERT INTO user_status (user_account_id, user_role_id) VALUES
(1, 1), -- now user `user1@myorg.com` has `activation_required` role
(1, 5), -- now user `user1@myorg.com` has `admin` role
(2, 1), -- now user `user2@myorg.com` has `activation_required` role
(2, 2), -- now user `user2@myorg.com` has `regular` role
(3, 1), -- now user `user3@myorg.com` has `activation_required` role
(1, 4), -- now user `user1@myorg.com` has `moderator` role
(3, 2); -- now user `user2@myorg.com` has `regular` role

因此,在后面的插入查询之后,我希望看到

moderator | 1
regular   | 2

因为只有3个用户(1 + 2),并且当前是一名主持人和两名常规用户。

1 个答案:

答案 0 :(得分:0)

因此,我设计了一个可以解决该问题的查询:

SELECT user_role.role, COUNT(user_status.*)
FROM user_account, user_status
        JOIN user_role ON user_role.id = user_status.user_role_id
WHERE user_status.created = (SELECT MAX(created) FROM user_status WHERE user_account.id = user_status.user_account_id)
GROUP BY user_role.role
ORDER BY user_role.role;