2015-10-06 110 views
1

我有一個包含3列的表稱爲記錄所有科目:學生,科目和年級如何選擇所採取的所有學生,使得學生在他們拿了級> 50

每個{X,Y,Z }表中的條目意味着學生x將y分爲z等級。如果學生x沒有參加課程y,那麼表格中就不存在該參賽作品。所以這個表格就像所有學生的大學記錄以及他們所學的科目。

我要選擇那些採取所有學生所有科目,所有學生在這些科目的成績都高於60

我試圖創建

CREATE TABLE temp SELECT subject FROM records WHERE grade > 60; 

然後我用臨時表創建一個具有主題和數量的新表,其中count統計接受該主題的學生數,然後刪除所有具有<學生數的行。但我知道這是非常低效的。

我怎樣才能做到這一點更有效地使用MySQL?
此外,如果你能給我提供良好的MySQL資源/教程鏈接,這樣我可以練習,我將感謝。我是MySQL的新手,我正在處理大型數據庫,我需要讓我的查詢更高效和直接。

回答

0

如何

SELECT subject FROM records 
WHERE subject NOT IN 
(
SELECT subject FROM records 
WHERE grade <=60 
) 
AND subject IN 
(
SELECT subject FROM records 
GROUP BY subject 
HAVING count(*) = (SELECT COUNT(DISTINCT student) FROM records) 
) 

隨着進一步的閱讀,我建議thisthis

編輯:現在包括「被所有學生進行了主題」

+0

編輯 - 添加了更多的閱讀建議。 –

+0

感謝您的建議,用這種方法的一個問題是,如果主題不採取每個人,但由少數學生採取與這一小羣學生拿到> = 60,然後這一主題將在此查詢顯示出來,但我不希望那。 –

+0

我明白。定義「小組」,我會更新。或者你想讓這個主題被所有學生拍攝? –

0

我會用不存在的,因爲條款它只是確認子查詢中是否沒有記錄,但不會嘗試獲取結果集。它比不在條款中更有效。

SELECT subject FROM records r1 
WHERE subject NOT EXISTS 
(
SELECT 1 FROM records r2 
WHERE r2.subject=r1.SUBJECT AND grade<=60 
) 
相關問題