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”,该术语有助于搜索解决方案,谢谢!