我有两个表,chatroom和ChatRoomMap,我想得到一个用户所属的聊天室列表,以及每个聊天室中的所有其他用户。
// this contains a map of user to chatroom, listing which user is in what room
CREATE TABLE ChatRoomMap
(
user_id bigint NOT NULL,
chatroom_id text NOT NULL,
CONSTRAINT uniq UNIQUE (userid, roomid)
)
// sample values
==========================
| user_id | chatroom_id |
| 1 | 7 |
| 1 | blue |
| 7 | red |
==========================和
CREATE TABLE ChatRoom
(
id text NOT NULL,
admin bigint,
name text,
created timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT uniqid UNIQUE (id)
)
// sample values
======================================================
| id | admin | name | timestamp |
| blue | 7 | blue room | now() |
| red | 2 | red | now() |
| 7 | 11 | mine | now() |
======================================================要获得用户所在房间的列表,我可以:
SELECT DISTINCT ON (id) id, userid, name, admin
FROM ChatRoomMap, ChatRoom WHERE ChatRoomMap.user_id = $1 AND ChatRoomMap.chatroom_id = ChatRoom.id这将给我一个明确的聊天室列表,用户在其中。
I想要得到不同的房间列表以及每个房间中的所有用户(作为一个单独的列连接所有用户),这是如何做到的?
举例结果:
=======================================================
| user_id | chatroom_id | name | admin | other_users |
| 10 | 7 | One | 1 | 1, 2, 3, 8 |
| 10 | 4 | AAA | 10 | 7, 11, 15 |
=======================================================发布于 2015-11-27 22:28:55
首先,使用适当的联接--显式join语法被引入到SQL92标准中,主要供应商在2000年初实现了它(这是实现外部连接的唯一方法)。
试试这个:
SELECT DISTINCT id, crm2.user_id, name, admin,
FROM ChatRoomMap crm1
JOIN ChatRoom ON crm1.chatroom_id = ChatRoom.id
LEFT JOIN ChatRoomMap crm2 ON crm2.chatroom_id = crm1.chatroom_id
AND crm2.user_id != crm1.user_id -- only other users
WHERE crm1.user_id = $1如果房间里没有其他用户,那么LEFT JOIN是必需的--它仍然会列出房间(带有其他用户id的null )。
https://stackoverflow.com/questions/33965418
复制相似问题