0

1つのグループの各クラスから1人の学生を探しています。さまざまなクラス グループがあり、すべてのグループにはさまざまなクラスがあり、すべてのクラスには複数の生徒がいます。下記参照:

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

クエリにはさまざまな結合が適用されています。上記のクエリで正しい結果が得られますが、少し変更する必要があります。現在のクエリは、各クラスから 1 人の学生を返します。

何が必要ですか?各クラスから 1 人の生徒が必要ですが、MAXIMUM を持っている生徒のみが必要です

 table1.marks

したがって、関連するクラスで最大数の生徒を各クラスから1人持つ必要があります。誰かが解決策を提案したり、このクエリを書き直したりできますか? ありがとう :)

4

2 に答える 2

2

のサブクエリは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 マークに一致するマークを持つ学生のみを返します。

于 2013-10-30T15:58:24.457 に答える
0

次のような max 関数を使用できます。

where table1.marks = max(table1.marks)
于 2013-10-30T16:04:02.840 に答える