我想获取房间的member
列表、房间的所有者member
(以防他不存在于其他表中)和管理员member
同一时间。目前我单独获取它们。
CREATE TABLE public.room_members (
id bigint NOT NULL,
member_id bigint,
room_id bigint,
group_id bigint
);
CREATE TABLE public.rooms (
id bigint NOT NULL,
member_id bigint,
group_id bigint,
name varchar(128)
);
CREATE TABLE public.members (
id bigint NOT NULL,
group_id bigint,
username varchar(128),
is_admin bool default false
);
CREATE TABLE public.groups (
id bigint NOT NULL,
name varchar(128)
);
-- My Group created
INSERT INTO "groups" (id, name) VALUES (1, 'My Group');
-- Create users for this group. We have 4 users/members
INSERT INTO "members" (id, group_id, username, is_admin) VALUES (1, 1, 'Pratha', true);
INSERT INTO "members" (id, group_id, username) VALUES (2, 1, 'John');
INSERT INTO "members" (id, group_id, username) VALUES (3, 1, 'Mike');
INSERT INTO "members" (id, group_id, username) VALUES (4, 1, 'April');
-- April creates a room and he is owner of this room
INSERT INTO "rooms" (id, group_id, member_id, name) VALUES (1, 1, 4, 'My Room'); -- 4 is April
-- April also adds Mike to the room members. But she does not add herself. As she is owner.
INSERT INTO "room_members" (id, group_id, room_id, member_id) VALUES (1, 1, 1, 3); -- 3 is Mike
我想要的是:
room_members
“我的房间”列表(目前只有 Mike)- 我的房间的所有者,以防他没有将自己添加到
room_members
表中。因为他是那个房间的主人(四月) - 另外,管理员成员(即 Pratha)
这应该是独一无二的。例如,如果用户将自己添加到 room_members
和 owner
中,那么它应该只获取一次成员。
到目前为止我尝试了什么?
select * from members
left outer join room_members cm on cm.member_id = members.id
left outer join rooms c on c.id = cm.room_id
where c.name = 'My Room' or members.id = 1
我也无法在这里使用 group by 。我也不需要所有字段。仅 room_members
表字段。
参见此处:https://rextester.com/XWDS42043
room_members
的预期输出:
+-------------+------------+------------+
| member_id | group_id | username |
+-------------+------------+------------+
| 1 | 1 | Pratha |
+-------------+------------+------------+
| 3 | 1 | Mike |
+-------------+------------+------------+
| 4 | 1 | April |
+-------------+------------+------------+
- Pratha:因为他是
管理员
- 迈克:因为他是“我的房间”的成员。
成员(member)
- 四月:因为她创建了那个房间。
所有者
room_members
可以有很多。我刚刚仅添加了 Mike,但它可以有多个成员,包括管理员和所有者。
最佳答案
您可以使用UNION
解决这个问题:
-- list the admin(s) of the room group
select m.id, m.group_id, m.username
from rooms r
inner join members m on m.group_id = r.group_id and m.is_admin = true
where r.name = 'My Room'
union
-- list the members of the room
select m.id, m.group_id, m.username
from rooms r
inner join room_members rm on r.id = rm.room_id
inner join members m on rm.member_id = m.id
where r.name = 'My Room'
union
-- recover the room owner
select m.id, m.group_id, m.username
from rooms r
inner join members m on r.member_id = m.id
where r.name = 'My Room'
UNION
消除了查询中的重复项,因此如果用户同时是成员和/或组管理员和/或房间所有者,则它们只会出现一次。
在你的 fiddle 中,此查询返回:
id group_id username
1 4 1 April
2 3 1 Mike
3 1 1 Pratha
关于sql - 在 PostgreSQL 12 上按 id(唯一)分组的一个查询中同时获取房间成员、房间所有者和管理员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58422227/