sql - 在 PostgreSQL 12 上按 id(唯一)分组的一个查询中同时获取房间成员、房间所有者和管理员

标签 sql postgresql join postgresql-12

我想获取房间的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“我的房间”列表(目前只有 Mike)
  2. 我的房间的所有者,以防他没有将自己添加到 room_members 表中。因为他是那个房间的主人(四月)
  3. 另外,管理员成员(即 Pratha)

这应该是独一无二的。例如,如果用户将自己添加到 room_membersowner 中,那么它应该只获取一次成员。

到目前为止我尝试了什么?

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/

相关文章:

mysql - 使用连接根据范围内的日期匹配表行

python - SQLAlchemy DateTime 时区

database - SELECT DISTINCT 是否意味着 Seq Scan?

php - SQL 删除与连接

MySQL:如何保持锁定并使其他线程等待尚未发生的插入

sql - 使用 ColdFusion 从 SQL 数据库中抓取长文本,输出被截断

mysql - SQL 嵌套查询解释为相关性不正确

ruby-on-rails - rails : Add UUID Primary Key to Table in Database Already Using UUIDs as Primary Keys

mysql - 从多个表中选择某些字段而不进行任何连接

具有多个条件的 SQL 多重左连接