【问题标题】:MySQL customized join query using multiple tablesMySQL 使用多个表的自定义连接查询
【发布时间】:2013-10-30 15:50:54
【问题描述】:

我正在从一组中的每个班级中搜索一名学生。有不同的班级小组,每个小组都有不同的班级,每个班级都有多个学生。见下文:

Group1 --> Class1, Class2 etc
Class1 --> GreenStudent1, GreenStudent2 etc
Class2 --> RedStudent1, RedStudent2 etc
------------------------------------------------------

SELECT 
   table1.id,
   table1.myname,
   table1.marks
   table2.studentid,
   table2.studentname
FROM table1
   INNER JOIN table3 ON table1.oldid = table3.id
   INNER JOIN table2 ON table2.studentid = table3.newid
WHERE 
   table1.classgroup = 'SCI79' 
GROUP BY table1.oldid
ORDER BY table1.marks DESC

查询中应用了不同的联接。上面提到的查询给了我正确的结果,但我几乎不需要修改它。当前查询返回我每个班级的一名学生。

我需要什么?我需要每个班级一个学生,但只有那个学生有 MAXIMUM

 table1.marks

所以我应该让每个班级的一名学生在其相关班级中人数最多。任何人都可以提出一些解决方案或重写此查询吗?谢谢:)

【问题讨论】:

  • 这将有助于显示表的一些实际结构(至少每个连接和列)和示例数据以显示规范化数据。

标签: mysql


【解决方案1】:

INNER JOIN 上的子查询应该处理这个问题:

SELECT t1.id
   ,t1.myname
   ,maxMarks.marks
   ,t2.studentid
   ,t2.studentname
FROM table1 t1
INNER JOIN table3 t3 ON t1.oldid = t3.id
INNER JOIN table2 t2 ON t2.studentid = t3.newid
INNER JOIN (
   SELECT id
      ,MAX(marks) AS marks
   FROM table1
   GROUP BY id
) maxMarks ON t1.id = maxMarks.id
   AND t1.marks = maxMarks.marks
WHERE t1.classgroup = 'SCI79'
GROUP BY t1.oldid
ORDER BY t1.marks DESC

加入具有 MAX 的聚合表本身应该将结果集过滤到每个学生及其各自的最高分。

编辑

我想我误读了你原来的问题......你只想要有 MAX(marks) 句号的学生吗?在这种情况下,请使用以下查询:

SELECT t1.id
   ,t1.myname
   ,t1.marks
   ,t2.studentid
   ,t2.studentname
FROM table1 t1
INNER JOIN table3 t3 ON t1.oldid = t3.id
INNER JOIN table2 t2 ON t2.studentid = t3.newid
WHERE t1.classgroup = 'SCI79'
   AND t1.marks = (
      SELECT MAX(marks) AS marks
      FROM table1
   )
GROUP BY t1.oldid
ORDER BY t1.marks DESC

WHERE 子句将只返回分数与整个表中的 MAX 分数匹配的学生。

【讨论】:

    【解决方案2】:

    你可以使用 max 函数,比如:

    where table1.marks = max(table1.marks)
    

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多