Postgresql 如何通过两组联接记录查询联接表中的数据?
我有三个表:Postgresql 如何通过两组联接记录查询联接表中的数据?,postgresql,Postgresql,我有三个表:用户,课程,和成绩,后者将用户和课程与一些元数据连接起来,比如课程的用户分数。我已经看过了,不过这个网站目前似乎不起作用。架构如下所示: CREATE TABLE users( id INT, name VARCHAR, PRIMARY KEY (ID) ); INSERT INTO users VALUES (1, 'Beth'), (2, 'Alice'), (3, 'Charles'), (4, 'Dave'); CREATE TABLE cour
用户
,课程
,和成绩
,后者将用户
和课程
与一些元数据连接起来,比如课程
的用户
分数。我已经看过了,不过这个网站目前似乎不起作用。架构如下所示:
CREATE TABLE users(
id INT,
name VARCHAR,
PRIMARY KEY (ID)
);
INSERT INTO users VALUES
(1, 'Beth'),
(2, 'Alice'),
(3, 'Charles'),
(4, 'Dave');
CREATE TABLE courses(
id INT,
title VARCHAR,
PRIMARY KEY (ID)
);
INSERT INTO courses VALUES
(1, 'Biology'),
(2, 'Algebra'),
(3, 'Chemistry'),
(4, 'Data Science');
CREATE TABLE grades(
id INT,
user_id INT,
course_id INT,
score INT,
PRIMARY KEY (ID)
);
INSERT INTO grades VALUES
(1, 2, 2, 89),
(2, 2, 1, 92),
(3, 1, 1, 93),
(4, 1, 3, 88);
我想知道如何(如果可能的话)构造一个查询来指定一些用户.id
值(1,2,3)和课程.id
值(1,2,3),并返回这些用户的成绩.score
这些课程的值
| name | Algebra | Biology | Chemistry |
|---------|---------|---------|-----------|
| Alice | 89 | 92 | |
| Beth | | 93 | 88 |
| Charles | | | |
在我的应用程序逻辑中,我将收到一个用户ID
和课程ID
数组,因此查询需要按主键动态选择这些用户和课程。(实际数据集包含数百万用户和上万门课程,以上示例只是一个示例。)
理想情况下,查询将:
- 将课程标题用作
分数数据的动态属性/列标题用户
- 按字母顺序对行标题和列标题进行排序
- 如果
-用户
对没有课程
关系,则包括空的/成绩
单元格NULL
JOIN
s和Postgresql的组合,但我不能完全理解它
更新:了解到这个术语是“动态透视”,我发现它似乎在试图用
crosstab()
解决Postgres中的一个相关问题,我认为一个简单的透视查询应该在这里起作用,因为您的数据集中只有4门课程要透视
SELECT t1.name,
MAX(CASE WHEN t3.title = 'Biology' THEN t2.score ELSE NULL END) AS Biology,
MAX(CASE WHEN t3.title = 'Algebra' THEN t2.score ELSE NULL END) AS Algebra,
MAX(CASE WHEN t3.title = 'Chemistry' THEN t2.score ELSE NULL END) AS Chemistry,
MAX(CASE WHEN t3.title = 'Data Science' THEN t2.score ELSE NULL END) AS Data_Science
FROM users t1
LEFT JOIN grades t2
ON t1.id = t2.user_id
LEFT JOIN courses t3
ON t2.course_id = t3.id
GROUP BY t1.name
按照下面的链接进行演示。我使用MySQL是因为,正如您所注意到的,SQLFIDLE似乎永远被其他数据库破坏
很抱歉,这4个用户和课程只是一个示例。我忽略了指定我的实际数据包含数以万计的课程和数百万用户(尽管我希望
SELECT
一次只能选择几十门课程和数千个用户),因此SELECT
在查询中按标题为每门课程设置数据不是一个选项,它需要是动态的。我现在试图在问题主体中澄清这一点。@SteveGrossi然后您将需要使用动态SQL。请尝试在谷歌上搜索“DynamicSQLPivot”,该术语有助于搜索解决方案,谢谢!