簡體   English   中英

高效查詢以聯接三個表

[英]Efficient query to join three tables

我的應用程序有一個users表,一個teams表,一個teams_users表和一個assessments表。 簡單化:

**users**
id

**teams**
id

**teams_users**
team_id
user_id

**assessments**
id
user_id
team_id

用戶可以進行許多評估。

當我在特定上下文中獲取用戶時,我也希望獲取其關聯的評估(整個對象),再加上返回的用戶的值,即team_ids ,這實際上是針對其中所有行都拔除了team_id列的結果帶用戶的user_idteams_users表。

我知道如何分別執行每個查詢,但是我不確定我可以組合成一個有效查詢的數量,甚至不確定如何執行該操作,因為我對SQL相當不了解。 我的第一個想法是這樣的:

SELECT users.id, users.name, users.email, users.role
FROM users
INNER JOIN assessments ON assessments.user_id = users.id
WHERE users.id='someID'

但是,在該查詢中,我實際上並未對評估做任何事情。 所以我在考慮這樣的事情:

SELECT users.id, users.name, users.email, users.role, assessments
FROM users
INNER JOIN assessments ON assessments.user_id = users.id
WHERE users.id='someID'

這種SORT的工作原理是,但將評估返回為括號分隔的值數組(我正在使用JavaScript,而pg庫則將響應解析為JSON),在SQL級別進行修復比將其解析為JSON似乎更好。 :

{
    id: 'mEPRVHp3',
    name: 'Frank',
    role: 'admin',
    assessments: '(uibbH0ff,rPWZDIoA,mEPRVHp3,99,2017-12-01)' 
}

為了澄清,我更喜歡這樣:

{
    id: 'mEPRVHp3',
    name: 'Frank',
    role: 'admin',
    assessments: [
     { 
       id: 'uibbH0ff',
       team_id: 'rPWZDIoA',
       user_id: 'mEPRVHp3',
       score: 99,
       date: '2017-12-01'
     }
   ]
}

然后,我想分別在同一查詢中獲取teams_users team_id 這樣最終響應是這樣的:

{
    id: 'mEPRVHp3',
    name: 'Frank',
    role: 'admin',
    assessments: [
     { 
       id: 'uibbH0ff',
       team_id: 'rPWZDIoA',
       user_id: 'mEPRVHp3',
       score: 99,
       date: '2017-12-01'
     }
   ],
   team_ids: ['rPWZDIoA']
}

試圖在SELECT語句的末尾添加teams_users.team_id AS team_ids ,但這破壞了整個查詢。

再次,不確定是否可行,在這種情況下,完全不確定如何執行。

有什么想法嗎? 使用有限的SQL技能。

謝謝!

假設您使用的是PostgreSQL 9.3或更高版本。

我將使用row_to_json()來“格式化”評估記錄。 然后,我將使用橫向聯接來獲取您的團隊ID。

像這樣:

SELECT
    usr.id,
    usr.name, 
    usr.email,
    usr.role,
    row_to_json(asmnt) AS assessments, --Use row_to_json()
    tusr.team_ids
FROM
    users usr
INNER JOIN
    assessments asmnt
    ON asmnt.user_id = usr.id
INNER JOIN LATERAL
    (
    SELECT
        array_agg(teams_users.team_id) AS team_ids
    FROM
        teams_users
    WHERE
        teams_users.user_id = usr.id
    ) tusr
    ON TRUE
WHERE
    usr.id = 'someID';

暫無
暫無

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

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