【问题标题】:Get student with the lowest grade per teacher让每个老师成绩最低的学生
【发布时间】:2015-02-26 23:06:14
【问题描述】:

这是我的桌子:

老师:

学生:

测试

老师有学生,学生有考试。

  SELECT
    t.name as teacherName,
    s.name as studentName,
    t.id as teacherID,
    s.id as studentID,
    MIN(tt.grade) as grade
    FROM teacher t
    JOIN student s ON s.`teacher_id` = t.id
    JOIN test tt ON tt.student_id = s.id
    GROUP BY studentID;

所以在这里我得到老师 -> 学生 -> 最低年级(6 行)

我想要的是

老师 -> 成绩最低的学生 -> 成绩(2 行)

我可以得到

老师 -> 每个老师的最低成绩

但后来学生姓名变得模棱两可,因为我没有按那个分组..

【问题讨论】:

  • 还在苦苦挣扎?如果您愿意,请考虑遵循这个简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 我在 xml、原始 sql 等中进行了续集转储。sqlfiddle 只是说:发生未知错误:XML 文档结构必须在同一实体内开始和结束。:

标签: mysql sql group-by subquery aggregate


【解决方案1】:

一般的想法是加入派生表,也就是带有别名的子查询。

select yourfields, temp.something, minvalue
from yourtables
join (
select something, min(value) minvalue
from yourtables
group by something
) temp on someTable.something = temp.something
and value = minvalue

你可以算出细节。

【讨论】:

  • 是的..过去 2 小时我一直在尝试这样做。这些细节现在真的很有帮助。哈哈
  • 从小处着手。一次只做一件事。
【解决方案2】:

您需要制作一个子表,得到老师的最低分数,然后加入该子表。像这样:

select t.name teacher_name, s.name student_name, x.min_grade
from teacher t
join student s on t.id = s.teacher_id
join test ts on s.id = ts.student_id
join (
  select sx.teacher_id, min(tsx.grade) min_grade
  from student sx
  join test tsx on sx.id = tsx.student_id
  group by 1) x on t.id = x.teacher_id and ts.grade = x.min_grade;

【讨论】:

    【解决方案3】:
    SELECT
    t.name as teacherName,
    s.name as studentName,
    t.id as teacherID,
    s.id as studentID,
    tt.grade
    FROM teacher t
    JOIN student s ON s.`teacher_id` = t.id
    JOIN test tt ON tt.student_id = s.id
    JOIN (
        SELECT 
        t.id teacherID, MIN(grade) AS grade
        FROM teacher t
        JOIN student s ON s.`teacher_id` = t.id
        JOIN test tt ON tt.student_id = s.id
        GROUP BY t.id    
    ) j
    ON j.teacherID = t.id AND j.grade = tt.grade;
    

    【讨论】: