高效查询连接三张表
Efficient query to join three tables
我的应用程序有一个 users
table、一个 teams
table、一个 teams_users
table 和一个 assessments
table。过度简化:
**users**
id
**teams**
id
**teams_users**
team_id
user_id
**assessments**
id
user_id
team_id
一个用户可以有多个评价。
当我在特定上下文中抓取用户时,我也想抓取他们的相关评估(整个对象),另外,作为返回用户的值,team_ids
本质上是结果使用用户的 user_id
为 teams_users
table 中的所有行提取 team_id
列。
我知道如何分别执行这些查询中的每一个,但我不确定我可以将多少组合成一个有效的查询,更不确定如何做到这一点,因为我对 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'
这类作品,但 returns 评估作为括号分隔的值数组(我使用 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']
}
试图将 teams_users.team_id AS team_ids
添加到 SELECT 语句的末尾,但这破坏了整个查询。
同样,不确定是否可行,在这种情况下,完全不确定该怎么做。
有什么想法吗?努力练习我有限的 SQL skillz.
谢谢!
假设您使用的是 PostgreSQL 9.3 或更新版本。
我会用row_to_json()
到"format"评估记录。然后我会使用横向连接来获取您的团队 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';
我的应用程序有一个 users
table、一个 teams
table、一个 teams_users
table 和一个 assessments
table。过度简化:
**users**
id
**teams**
id
**teams_users**
team_id
user_id
**assessments**
id
user_id
team_id
一个用户可以有多个评价。
当我在特定上下文中抓取用户时,我也想抓取他们的相关评估(整个对象),另外,作为返回用户的值,team_ids
本质上是结果使用用户的 user_id
为 teams_users
table 中的所有行提取 team_id
列。
我知道如何分别执行这些查询中的每一个,但我不确定我可以将多少组合成一个有效的查询,更不确定如何做到这一点,因为我对 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'
这类作品,但 returns 评估作为括号分隔的值数组(我使用 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']
}
试图将 teams_users.team_id AS team_ids
添加到 SELECT 语句的末尾,但这破坏了整个查询。
同样,不确定是否可行,在这种情况下,完全不确定该怎么做。
有什么想法吗?努力练习我有限的 SQL skillz.
谢谢!
假设您使用的是 PostgreSQL 9.3 或更新版本。
我会用row_to_json()
到"format"评估记录。然后我会使用横向连接来获取您的团队 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';