Mysql SQL-如何找到得分最高的人

Mysql SQL-如何找到得分最高的人,mysql,sql,Mysql,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 Burto

我正在努力寻找在大数据课程中获得最高分数的人的名字

我有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 |
+------------+----------+
最简单的方法是将LIMT 1与ORDER BY DESC子句一起使用:

最简单的方法是将LIMT 1与ORDER BY DESC子句一起使用:


不知道MySql的查询结构。这是分步骤解释的。我希望您可以在此基础上构建查询

根据表之间的关系连接三个表 在where子句中设置课程名称“大数据” 将坡度顺序设置为“描述顺序” 将限制设置为仅获取第一行。
不知道MySql的查询结构。这是分步骤解释的。我希望您可以在此基础上构建查询

根据表之间的关系连接三个表 在where子句中设置课程名称“大数据” 将坡度顺序设置为“描述顺序” 将限制设置为仅获取第一行。 试试这个

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子句上应用运算符

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子句上应用运算符。如果你想要领带。也就是说,如果超过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

如果您只想要一张唱片,GiorgosBestos鞋款的选择是正确的。如果你想要领带。也就是说,如果超过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

以下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相似但不完全相同。

以下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相似,但不完全相同。

mysql或SQL server?我试图找到问题最多的用户,我该怎么做?如果不使用任何花哨的SQL功能,我的意思是,一点也不花哨,没有人为限制的意义,我知道这是你们老师给你们的限制,但我还是想尝试一个答案,但数据太微不足道,很难看到边缘案例,让它不值得回答IMO。如果不止一个人可以获得最高分数,你想要什么?mysql或sql server?我正在试图找到有最多stackoverflow家庭作业问题的用户,我该怎么做?如果不使用任何花哨的sql功能,我的意思是,一点也不花哨,没有人为限制的意义,我知道这是你们老师给你们的限制,但我还是想尝试一个答案,但数据太微不足道,很难看到边缘案例,不值得回答。如果不止一个人可以获得最高分数,您希望如何?这不包括两个学生获得最高分数的情况。@SamuelRenold一种方法是将该查询用作只返回分数的辅助表。现在你只需要搜索那些没有等级限制的人。tl;dr:嵌套式问题我发布了一个答案,涵盖了更多学生拥有相同最高分数的情况。该SQL与Matt发布的另一个SQL相似,但不完全相同。这不包括两个学生成绩最高的情况。@SamuelRenold一种方法是将该查询用作只返回成绩的辅助表。现在你只需要搜索那些没有等级限制的人。tl;dr:嵌套式问题我发布了一个答案,涵盖了更多学生拥有相同最高分数的情况。该SQL与Matt发布的另一个SQL相似,但不完全相同。