sqlmax和Double-Join

sqlmax和Double-Join,sql,Sql,我有以下三个表格: student ------- stnumb stname gender grade born subject ------- subjnumb subjname tname results ------- stnumb subjnumb percent 我需要返回每个学生的最高成绩及其科目 示例:鲍勃·史密斯,IPT,92岁 我得到的两个最接近的结果是: SELECT stname , subjname , highestmark FROM

我有以下三个表格:

student
-------
stnumb
stname
gender
grade
born

subject
-------
subjnumb
subjname
tname

results
-------
stnumb
subjnumb
percent
我需要返回每个学生的最高成绩及其科目

示例:鲍勃·史密斯,IPT,92岁

我得到的两个最接近的结果是:

SELECT  stname
    ,   subjname
    ,   highestmark
FROM    (
            SELECT      MAX(results.percent) as "highestmark"
                    ,   student.stname
                    ,   subject.subjname
            FROM        student
                    ,   subject
                    ,   results
            WHERE       results.stnumb      = student.stnumb
            AND         results.subjnumb    = subject.subjnumb
            GROUP BY    stname
        ) maxresult
……还有

SELECT      student.stname as Student
        ,   subject.subjname as Subject
        ,   results.percent as Mark
FROM        results 
JOIN        student
ON          results.stnumb = student.stnumb
JOIN        subject
ON          results.subjnumb = subject.subjnumb
ORDER BY    stname
有人能给我指一下正确的方向吗?我已经为此工作了好几天,没有任何进展。

从GROUP by中缺少SubName判断,这是MySql。MySql没有分析功能,所以您需要调用Top1的旧形式。有一个版本的派生表包含最大值。此表用于筛选原始表:

SELECT pct, subjname, stname 
FROM
(SELECT r.pct, sub.subjname, std.stname,
RANK () OVER (PARTITION BY sub.subjname ORDER BY r.pct) as rk
FROM student std 
INNER JOIN results r ON r.stnumb = std.stnumb 
INNER JOIN subject sub ON sub.subjnumb = r.subjnumb 
GROUP BY sub.subjname, std.stname, r.pct ) a
WHERE rk = 1
SELECT      student.stname as Student
        ,   subject.subjname as Subject
        ,   results.percent as Mark
FROM        results 
JOIN        student
ON          results.stnumb = student.stnumb
JOIN        subject
ON          results.subjnumb = subject.subjnumb
JOIN
(
   SELECT stnumb, MAX(percent) percent
     FROM results
    GROUP BY stnumb
) top1GradePerStudent
  ON results.stnumb = top1GradePerStudent.stnumb
 AND results.percent = top1GradePerStudent.percent
ORDER BY    stname
也不存在只检索百分比不高的学生记录的方法:

SELECT      student.stname as Student
        ,   subject.subjname as Subject
        ,   results.percent as Mark
FROM        results 
JOIN        student
ON          results.stnumb = student.stnumb
JOIN        subject
ON          results.subjnumb = subject.subjnumb
WHERE       NOT EXISTS 
            (
                SELECT null
                  FROM results r2
                 WHERE r2.stnumb = results.stnumb
                   AND r2.percent > results.percent
            )
ORDER BY    stname
这两种方式都会带来回报。如果每个学生都必须有一个记录,请用MAX或MIN括起subjectname,因为行中的所有其他数据都是相同的,所以选择哪个科目并不重要


另外,我没有测试这个问题。可能有输入错误,但基本方法是正确的。

它不起作用是非常模糊的,您具体有什么问题?我已经在sqlfiddle中测试了该查询并执行了它。虽然除了您提供的数据结构之外,我对您的数据结构一无所知,但我无法假设什么会“起作用”。我建议的方法是按…顺序排列而不是按…划分。。是解决您概述的问题的正确方法。我知道,这是含糊不清的,但我无法给出任何原因,当您输入错误的查询时,它所做的一切都不会返回任何内容,因此问题可能存在于任何地方。如果我知道更多,我会这么说。伙计,你是传奇人物!非常感谢!!!第一个查询工作得绝对完美。谢谢你的帮助。