簡體   English   中英

SQL - 從表中獲取並使用相同的表連接

[英]SQL - get from table and join with same table

我有兩個表,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

這將為我提供一個用戶所在的聊天室列表。

我想獲得不同的房間列表以及每個房間中的所有用戶(將所有用戶連接成一個單獨的列),如何做到這一點?

示例結果:

=======================================================
| user_id  | chatroom_id | name | admin | other_users |
|    10    |     7       | One  |   1   | 1, 2, 3, 8  |
|    10    |     4       | AAA  |   10  | 7, 11, 15   |
=======================================================

首先,使用正確的連接 - SQL92標准引入了顯式join語法,主要供應商在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

如果房間里沒有其他用戶,它仍然會列出房間(其他用戶ID為null ,則需要LEFT JOIN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM