2016-09-12 35 views
1

我試圖找到在「大數據」課程中獲得最高成績的人的名字。SQL - 如何找到最高年級的人

我有3個不同的表:

People (id, name, age, address) 
--------------------------------------------------- 
p1 | Tom Martin| 24 | 11, Integer Avenue, Fractions, MA 
p2 | Al Smith | 33 | 26, Main Street, Noman's Land, PA 
p3 | Kim Burton| 40 | 45, Elm Street, Blacksburg, VA 
--------------------------------------------------- 

Courses (cid, name, department) 
--------------------------------------------------------- 
c1 | Systematic Torture | MATH 
c2 | Pretty Painful  | CS 
c3 | Not so Bad   | MATH 
c4 | Big Data   | CS 
--------------------------------------------------------- 

Grades (pid, cid, grade) 
--------------------------------------------------- 
p1 | c1  | 3.5 
p2 | c3  | 2.5 
p3 | c2  | 4.0 
p3 | c4  | 3.85 
--------------------------------------------------- 

我無法弄清楚如何找到具有最高等級的人,而無需使用任何花哨的SQL功能。也就是說,我只想使用SELECT,FROM,WHERE,UNION,INTERSECT,EXCEPT,CREATE VIEW和算術比較運算符,如=,<,>。 我的結果是顯示了一些東西,而不是我試圖實現的。

這是我到目前爲止已經試過:

CREATE VIEW TEMPFIVE AS 
    SELECT G1.pid FROM Grades AS G1, Grades AS G2 WHERE G1.pid = G2.pid AND G1.cid = G2.cid 

    SELECT People.name, Courses.name FROM TEMPFIVE, People, Courses WHERE TEMPFIVE.pid = People.pid AND Courses.name = "Big Data"; 

+------------+----------+ 
| name  | name  | 
+------------+----------+ 
| Tom Martin | Big Data | 
| Al Smith | Big Data | 
|Kim Burton | Big Data | 
|Kim Burton | Big Data | 
+------------+----------+ 
+3

mysql或sql-server? – techspider

+0

你使用的是MySQL還是MS SQL Server?答案可能取決於它。 (並且不要標記不涉及的產品。) – jarlh

+4

我正在嘗試找到用戶最常用的stackoverflow作業問題,我該怎麼做? –

回答

5

最簡單的方法是使用LIMT 1ORDER BY DESC條款:

SELECT p.name, c.name, g.grade 
FROM People AS p 
JOIN Grades AS g ON p.id = g.pid 
JOIN Courses AS c ON c.cid = g.cid 
WHERE c.name = "Big Data" 
ORDER BY g.grade DESC LIMIT 1 
+2

這並不包括兩個學生成績最好的情況。 –

+1

@SamuelRenold你可以這樣做的一種方式是使用該查詢作爲返回等級的輔助表。現在你只需要搜索那個年級的人(沒有限制)。 (tl; dr:嵌套查詢) – Edu

+0

我發佈了一個答案,涵蓋了具有相同最高成績的更多學生的情況。 SQL與Matt發佈的另一個SQL相似但不相同。 –

0

爲MySQL查詢結構不知道。所以分步解釋。我希望你可以基於此建立查詢。

  1. 根據其在where子句
  2. 組級以降序排序
  3. 將限制設置爲僅取第一行關係
  4. 一套課程名稱「大數據」加入三個表。
0

試試這個

select * from(
select p.id pid,p.name name, p.age age,p.address address, 
c.cid cid, c.name coursname, c.department department,g.grade grade 
from Grades G 
left join 
Courses C on g.cid = c.cid 
left join 
People p on g.pid = p.id 
)a where coursname= 'Big Data' order by grade desc 

您可以將運營商在where子句

0

GiorgosBestos鞋子的正確方式,如果你只想要1分的紀錄。如果你想要關係。這意味着如果超過1名學生有相同的最高等級,那麼你可以做一個子查詢如下:

SELECT p.name, c.name, g.grade 
FROM 
    (
     SELECT c.cid, MAX(g.grade) MaxGrade 
     FROM 
      Grades g 
      INNER JOIN Courses c 
      ON c.cid = g.cid 
      AND c.name = 'Big Data' 
     GROUP BY 
      c.cid 
    ) m 
    INNER JOIN Grades g 
    ON g.cid = m.cid 
    AND g.grade = m.MaxGrade 
    INNER JOIN People p 
    ON g.pid = p.id 
0

下面的SQL覆蓋的情況下,當拖車或更多的學生擁有相同的最大等級:

SELECT P.NAME, 
     C.NAME, 
     G.GRADE 
FROM PEOPLE P 
JOIN GRADES G ON G.PID = P.ID 
JOIN COURSES C ON C.CID = G.CID 
WHERE C.NAME = 'Big data' 
AND G.GRADE = (SELECT MAX(G2.GRADE) 
        FROM PEOPLE P2 
        JOIN GRADES G2 ON G2.PID = P2.ID 
        JOIN COURSES C2 ON C2.CID = G2.CID 
        WHERE C2.NAME = 'Big data'); 

它與Matt提出的SQL相似但不完全相同。