我有三个表:users
,courses
,并grades
,后者使用类似user
的score
为course
一些元数据加入users
和courses
。我created a SQLFiddle,虽然该网站目前似乎没有工作。该模式是这样的:如何通过两组连接记录查询连接表中的数据?
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);
我想知道如何(如果可能)构造查询指定一些users.id
值(1,2,3)和courses.id
值(1,2,3)并返回这些用户的grades.score
值这些课程
| name | Algebra | Biology | Chemistry |
|---------|---------|---------|-----------|
| Alice | 89 | 92 | |
| Beth | | 93 | 88 |
| Charles | | | |
以我的应用程序逻辑,我将接收的user_ids
和course_ids
阵列,所以查询需要通过主键选择这些用户和课程动态。 (实际数据集包含数百万用户和成千上万的课程,上述例子只是一起工作的样本。)
理想的情况下,查询将:
- 使用的课程名称为动态属性/用于
users
'列标题得分数据 - 排序行和列标题按字母顺序
- 包括空/
NULL
细胞如果user
-course
对具有无grades
关系
我怀疑我可能需要JOIN
s和Postgresql的crosstab
的一些组合,但我不能完全包围它。
更新:得知这个术语是“动态的支点”,我发现this SO answer这似乎是试图解决Postgres的一个相关的问题与crosstab()
对不起,这4个用户和课程只是一个示例。我忽略了指定我的实际数据包含数万个课程和数百万用户(尽管我希望每次只选择几十个课程和数千个用户),所以'按照标题选择每个课程的数据在查询中不是一个选项 - 它需要是动态的。我现在试图在问题主体中澄清这一点。 –
@SteveGrossi然后你将需要使用动态SQL。尝试谷歌搜索“动态的数据透视表” –
该术语有助于寻找解决方案,谢谢! –