2016-09-22 65 views
2

我有三個表:userscourses,並grades,後者使用類似userscorecourse一些元數據加入userscourses。我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_idscourse_ids陣列,所以查詢需要通過主鍵選擇這些用戶和課程動態。 (實際數據集包含數百萬用戶和成千上萬的課程,上述例子只是一起工作的樣本。)

理想的情況下,查詢將:

  • 使用的課程名稱爲動態屬性/用於users'列標題得分數據
  • 排序行和列標題按字母順序
  • 包括空/ NULL細胞如果user - course對具有無grades關係

我懷疑我可能需要JOIN s和Postgresql的crosstab的一些組合,但我不能完全包圍它。

更新:得知這個術語是「動態的支點」,我發現this SO answer這似乎是試圖解決Postgres的一個相關的問題與crosstab()

回答

0

我認爲一個簡單的數據透視查詢應該在這裏工作,因爲您的數據集中只有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是因爲,正如你所注意到的,SQLFiddle似乎永遠破壞了其他數據庫。

SQLFiddle

+0

對不起,這4個用戶和課程只是一個示例。我忽略了指定我的實際數據包含數萬個課程和數百萬用戶(儘管我希望每次只選擇幾十個課程和數千個用戶),所以'按照標題選擇每個課程的數據在查詢中不是一個選項 - 它需要是動態的。我現在試圖在問題主體中澄清這一點。 –

+1

@SteveGrossi然後你將需要使用動態SQL。嘗試谷歌搜索「動態的數據透視表」 –

+0

該術語有助於尋找解決方案,謝謝! –