2012-10-29 57 views
0

我有不同的表像使用多個表獲取數據連接

Student 
primary id , students name, course 

Papers 
paper id, papername, course, semester, type 

StudentOptions 
primary id, studentid (foreign key - reference student id) and paperid (foreign key - references paper id) 

StudentsTerm 
studentid (foreign key- references student id) and student semester

現在的那種結果,我想是的,

我想選擇一門課程,然後術語,這將給我論文的數量/主題與其類型(強制/可選)以及我希望從所有這些表中學習這些論文的學生人數。

我不想創建任何視圖或東西,只是一個正常的選擇查詢會做。

我運行的查詢是:

SELECT p_name, 
     p_id, 
     type, 
     Count(sps.studentid) AS counts 
FROM students, 
     str, 
     papers 
     LEFT JOIN sps 
       ON sps.paperid = papers.p_id 
WHERE sps.studentid = students.studentid 
     AND students.studentid = str.studentid 
     AND sps.studentid = str.studentid 
     AND str.semesterid = p_semid 
     AND str.sessionid = 12 
     AND students.course = c_id 
     AND c_id = 6 
     AND p_semid = 1 
GROUP BY p_id 

感謝您的幫助提前。

+1

你目前的查詢返回什麼?什麼不工作? – Msonic

+0

它只給我那些學生正在學習的論文。我希望所有給定的學期和課程的論文,如果沒有任何學習,那麼它應該給我零。 –

回答

2

作爲更好的做法,如果要使用明確的JOIN語法,則不要使用隱式語法。在上面發佈的查詢中,您從papers中選擇,但不會在任何地方使用它。此外,您的列名稱稍有不明確。如果更容易,可以使用單個字母爲每個表格別名,或者顯式地爲列名添加前綴。如果您使用GROUP BY的聚合,則不能選擇不在組中的列。

假設這是你的ER圖:

讓我們先加入的所有表:

SELECT a.id, a.name 
FROM student a 
JOIN str b ON b.student_id = a.id 
JOIN sps c ON c.student_id = a.id 
JOIN papers d ON d.id = c.paper_id 

現在你想找到學生從具體課程研究的論文數量並輸入:

SELECT a.id, a.name 
FROM student a 
JOIN str b ON b.student_id = a.id 
JOIN sps c ON c.student_id = a.id 
JOIN papers d ON d.id = c.paper_id 
WHERE b.semester = 12 
    AND d.course = 6 

因爲喲你的屬性是模糊的,很難說它們來自哪個表。如果您可以在SQL Fiddle上設置結構和樣本數據,我們可以幫助您更好。

+0

我想從論文中獲得論文名稱,這就是爲什麼要使用它。 –

+0

是的。這是如何。 –

+0

給我幾分鐘。我會清除它。 –

相關問題