首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL -从表中获取并与同一表连接

SQL -从表中获取并与同一表连接
EN

Stack Overflow用户
提问于 2015-11-27 22:14:01
回答 1查看 55关注 0票数 1

我有两个表,chatroom和ChatRoomMap,我想得到一个用户所属的聊天室列表,以及每个聊天室中的所有其他用户。

代码语言:javascript
运行
复制
// 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     |
==========================

代码语言:javascript
运行
复制
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()   |
======================================================

要获得用户所在房间的列表,我可以:

代码语言:javascript
运行
复制
SELECT DISTINCT ON (id) id, userid, name, admin 
FROM ChatRoomMap, ChatRoom WHERE ChatRoomMap.user_id = $1 AND ChatRoomMap.chatroom_id = ChatRoom.id

这将给我一个明确的聊天室列表,用户在其中。

I想要得到不同的房间列表以及每个房间中的所有用户(作为一个单独的列连接所有用户),这是如何做到的?

举例结果:

代码语言:javascript
运行
复制
=======================================================
| user_id  | chatroom_id | name | admin | other_users |
|    10    |     7       | One  |   1   | 1, 2, 3, 8  |
|    10    |     4       | AAA  |   10  | 7, 11, 15   |
=======================================================
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-27 22:28:55

首先,使用适当的联接--显式join语法被引入到SQL92标准中,主要供应商在2000年初实现了它(这是实现外部连接的唯一方法)。

试试这个:

代码语言:javascript
运行
复制
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 )。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33965418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档