2017-05-11 21 views
1
Semesters Table 
+----+------+ 
| ID | Name | 
+----+------+ 
| 1 | 1st | 
| 2 | 2nd | 
+----+------+ 

Subjects Table 
+----+-------------+-------------+ 
| ID | Semester Id |  Name | 
+----+-------------+-------------+ 
| 1 |   1 | Mathematics | 
| 2 |   1 |  English | 
| 3 |   2 | Mathematics | 
| 4 |   2 |  English | 
+----+-------------+-------------+ 

Tests Table 
+----+------------+-------+ 
| ID | Subject ID | Score | 
+----+------------+-------+ 
| 1 |   1 | 70 | 
| 2 |   1 | 75 | 
| 3 |   2 | 75 | 
| 4 |   2 | 70 | 
| 5 |   3 | 75 | 
| 6 |   3 | 70 | 
| 7 |   4 | 70 | 
| 8 |   4 | 75 | 
+----+------------+-------+  

2番目のテストのスコアは、テストのIDにMAXを使用して取得し、サブジェクトIDでグループ化することができます。しかし、その後、私は学期でグループ化されたスコアの最小値を取得する必要があります。最大数のSQL

1つのSQL文で、各学期の最低スコア2NDテストを取得できますか?

結果セットは次のようになります。

+----------+-------------+-------+ 
| Semester |  Subject | Score | 
+----------+-------------+-------+ 
|  1st |  English | 70 | 
|  2nd | Mathematics | 70 | 
+----------+-------------+-------+ 

これはMySQL版です。

+0

MySQL。ビューを作成してビューに参加することを考えましたが、何百ものテストがあるときに問題が発生する可能性があります。 –

+0

'何かの下限の制限2 'は' something'の値によって2つの最も低い結果を与えます。等しく低い値がいくつかある場合、これらのすべてをこのようにしないことに注意してください。代わりに[分析関数](https://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead-lag/)を検討してください。 – 9000

+1

例には2つのテストしかありません。なぜ "2nd"は最小限ではないのですか?あなたは関係について何をしていますか? –

答えて

1

あなたは、学期ごとに2番目に低いテストを探しています。

1学期ごとに発注されたテストの行番号を作成し、#2の番号を付けたままにしてください。これを行う1つの方法は、相関サブクエリです。もう一つは変数です。

select 
    sem.name as semester, 
    sub.name as subject, 
    tst.score 
from semesters sem 
join subjects sub on sub.semester_id = sem.id 
join tests tst on tst.subject_id = sub.id 
where 
(
    select count(*) 
    from subjects sub2 
    join tests tst2 on tst2.subject_id = sub2.id 
    where sub2.semester_id = sub.semester_id 
    and sub2.id <= sub.id 
    and tst2.score <= tst.score 
) = 2 
order by sub.semester_id; 

結び目の場合は、例のように1つの行が選択されます。

おそらく、変数を使った作業は上記のクエリより高速です。 MySQLでROW_NUMBERをエミュレートする方法を探して、このメソッドを簡単に見つけることができます。 (その他のDBMSは、はるかに簡単なROW_NUMBERを使用しますが、MySQLにはこの機能がありません)。

0
select a.name as semester 
    , b.name as subject 
    , min(c.score) as lowestscore 
from subjects as b 
    join semesters as a on a.id = b.semester_id 
    join tests as c on c.subject_id = b.id 
group by a.name, b.name 

あなたはおそらく何かで注文したいと思うでしょうが、これはあなたが探しているものを与えるはずです。あなたは学期や科目の範囲にさらに弁別者を加えることができますが、これにより学期の名前、科目の名前、その学期/科目の最低得点が得られます。