2014-05-12 94 views
1

鑑於模式:SQLite的,聚集查詢的WHERE子句

CREATE TABLE Student (
    studentID INT PRIMARY KEY NOT NULL, 
    studentName TEXT NOT NULL, 
    major TEXT, 
    class TEXT CHECK (class IN ("Freshman", "Sophomore", "Junior", "Senior")), 
    gpa FLOAT CHECK (gpa IS NULL OR (gpa >= 0 AND gpa <= 4)), 
    FOREIGN KEY (major) REFERENCES Dept(deptID) ON UPDATE CASCADE ON DELETE CASCADE 
); 

CREATE TABLE Dept (
    deptID TEXT PRIMARY KEY NOT NULL CHECK (LENGTH(deptID) <= 4), 
    NAME TEXT NOT NULL UNIQUE, 
    building TEXT 
); 

CREATE TABLE Course (
    courseNum INT NOT NULL, 
    deptID TEXT NOT NULL, 
    courseName TEXT NOT NULL, 
    location TEXT, 
    meetDay TEXT NOT NULL CHECK (meetDay IN ("MW", "TR", "F")), 
    meetTime INT NOT NULL CHECK (meetTime >= '07:00' AND meetTime <= '17:00'), 
    PRIMARY KEY (courseNum, deptID), 
    FOREIGN KEY (deptID) REFERENCES Dept(deptID) ON UPDATE CASCADE ON DELETE CASCADE 
); 

CREATE TABLE Enroll (
    courseNum INT NOT NULL, 
    deptID TEXT NOT NULL, 
    studentID INT NOT NULL, 
    PRIMARY KEY (courseNum, deptID, studentID), 
    FOREIGN KEY (courseNum, deptID) REFERENCES Course ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (studentID) REFERENCES Student(studentID) ON UPDATE CASCADE ON DELETE CASCADE 
); 

我試圖找到的名稱,編號,以及他們正在採取,爲學生的課程誰是服用次數最多的數當然。用於檢索名稱和ID的SELECT非常簡單,但是我無法確定如何選擇每個學生正在進行的課程的數量,然後找到最大值並將其用作WHERE子句。

這是我到目前爲止有:

SELECT Student.studentName, Student.studentID, COUNT(*) AS count 
FROM Enroll 
INNER JOIN Student ON Enroll.studentID=Student.studentID 
GROUP BY Enroll.studentID 

回答

0

所以,首先你,對你現有的查詢使用HAVING到每個學生所有註冊類

SELECT COUNT() AS num 
FROM Enroll 
GROUP BY studentID 

就可以檢查的次數得到你的最終查詢。

SELECT Student.studentName,Student.studentID,COUNT(*) AS count 
     FROM Enroll 
     INNER JOIN Student ON Enroll.studentID=Student.studentID 
     GROUP BY Enroll.studentID 
     HAVING COUNT()=(SELECT COUNT() AS num FROM Enroll GROUP BY studentID); 

因此,要回顧一下這主要獲得代表對任何學生人數最多的招生數量,然後得到所有學生在那裏,這個數字是他們招生的數量,從而具有最高,或等於最高的所有學生註冊人數。

我們使用HAVING,因爲它應用於GROUP BY之後,這意味着您不能在WHERE子句中使用聚合函數,例如COUNT()