2014-02-13 62 views
0

好的。這是一項家庭作業練習。我嘗試查找所有內容並找不到錯誤。 架構如下:基本的mySQL - 不知道如何顯示所有結果,包括0

course{ 
course_id 
title 
dept 
} 

section{ 
course_id 
semester 
year 
} 

課程表有所有提供的課程。 部分表具有提供過去和未來的課程。

我要列出每門課程已提供多少次。即使它以前從未提供過。 (包括零)。

所以。到目前爲止,我所做的是分別進行每個部分的子查詢,但我在合併這兩者時失敗了。 (這是我需要你幫助的地方。)(旁註:我是新來的sql,對不起,如果查詢看起來痛苦低效)

所以我知道如何獲得所有課程和排序。

SELECT course_id FROM course ORDER BY course_id; 

我也知道如何計算所有課程提供的次數。

SELECT course_id, COUNT(course_id)FROM section GROUP BY course_id; 

所以我想,使用這兩個子查詢來做出結果!

SELECT * FROM 
(
SELECT course_id, COUNT(course_id) FROM section GROUP BY course_id 
) AS T1 
NATURAL JOIN 
(
SELECT course_id FROM course ORDER BY course_id 
) as T2; 

但是,這忽略了計數爲0的課程。我試過使用IFNULL,但我可能會使用它錯誤。

回答

1

你可以做(從多到少優先)

SELECT c.course_id, COUNT(s.course_id) total 
    FROM course c LEFT JOIN section s 
    ON c.course_id = s.course_id 
GROUP BY c.course_id; 

SELECT c.course_id, COALESCE(total, 0) total 
    FROM course c LEFT JOIN 
(
    SELECT course_id, COUNT(*) total 
    FROM section 
    GROUP BY course_id 
) s 
    ON c.course_id = s.course_id; 

SELECT course_id, 
(
    SELECT COUNT(*) 
    FROM section 
    WHERE course_id = c.course_id 
) total 
    FROM course c; 

注:那在第一個問詢中如果使用LEFT JOIN,則必須從section表中計數course_id,而不是從section計數。

這裏是SQLFiddle演示

0

你只是想立足查詢過的章節,並LEFT JOIN這吻合了偶數部分尚未對的右側課程加入

SELECT section.course_id, COUNT(course.id) FROM section 
    LEFT JOIN course ON course.course_id = section.course_id 
    GROUP BY section.course_id 
+0

我只是解決了它使用我的可怕大型查詢。我只需要使用LEFT JOIN。我也試過你的。它只是返回一個課程id。然後我嘗試通過course_id添加組。問題在於它增加了0個案例。 –

+0

不太確定你的意思,我會建議嘗試使用最新的更新答案。無論如何,如果你已經解決了這個問題非常好! – Bryan

+0

基本部分可能有{A A B B C},課程將列出每一個。 {A B C D},我需要將輸出格式化爲{(A,2),(B,2)(C,1)(D,0)}。布萊恩跳過(D,0) –

0

這是我所管理的答案弄清楚這個工作。

SELECT T1.course_id , IFNULL(t2Count , 0) FROM 
(
SELECT course_id FROM course ORDER BY course_id 
) AS T1 
LEFT JOIN 
(
SELECT course_id, COUNT(course_id) as t2Count FROM section GROUP BY course_id 
) as T2 
ON 
T1.course_id=T2.course_id; 

我會選擇第一個獲得與此相同結果的人,使用較短的查詢。 (不包括變量名)