2

我想获取房间的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

我想要的是:

  1. room_members“我的房间”列表(目前只有迈克)
  2. 我房间的主人,以防他没有将自己添加到room_members餐桌上。因为他是那个房间的主人(也就是四月)
  3. 另外,管理员成员(即 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   |
+-------------+------------+------------+
  • 普拉塔:因为他是ADMIN
  • 迈克:因为他是我的房间的成员。MEMBER
  • April:因为她创造了那个房间。OWNER

room_members可以很多。我只添加了 Mike,但它可以有多个成员,包括管理员和所有者。

4

1 回答 1

2

您可以通过以下方式解决此问题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消除了查询中的重复项,因此如果用户既是成员和/或组管理员和/或房间的所有者,他们只会出现一次。

在您的小提琴中,此查询返回:

id  group_id    username
1   4   1       April
2   3   1       Mike
3   1   1       Pratha
于 2019-10-16T22:28:55.837 回答