我有三個表: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。嘗試谷歌搜索「動態的數據透視表」 –
該術語有助於尋找解決方案,謝謝! –