2016-10-01 8 views
0

基本的に、私は1つのテーブル(テストDB)を持つ単純なデータベースを持っています。私が求めている理由です(私が何をしようとしているWrittenGrade SQLの予期しない戻り値

は非常に単純です

  • ID
  • 名前
  • OralGrade
  • : 表には4つの列がありますあなたの助け):私は名前平均の学生の平均を取得したいと思います。私が試した何

    SELECT nom, MAX(avg) 
        FROM ( 
         SELECT nom, (noteOrale + noteEcrit)/2 as avg 
         FROM etudiant 
         GROUP BY nom) AS Table; 
    

    このクエリを試した後、それは私に名前平均を返されたが、平均は名前に対応していません。

    誰かが私に指針を与えたり、何がうまくいかなかったか説明できますか?おかげ

答えて

2

order bylimit使用。何サブクエリは必要ありません:

SELECT nom, (noteOrale + noteEcrit)/2 as avg 
    FROM etudiant 
    ORDER BY avg DESC 
    LIMIT 1; 

値はすべて1行上にあるので、何のGROUP BYはどちらか必要でないように見えます。

彼らは複数行ある場合は、GROUP BYを必要としています。

+0

ありがとうございました。私はあなたの答えを正しいものにしますが、少し簡単です。 –

1

は、私はちょうどこのためlimitを使用します。

SELECT nom, avg 
FROM (
    SELECT nom, (noteOrale + noteEcrit)/2 as avg 
    FROM etudiant 
    GROUP BY nom 
) t 
ORDER BY avg DESC 
LIMIT 1 

mysqlあなたはgroup by句ですべての非集計列を含めずに凝集を使用することができます - ので、あなたのクエリは名前だけのために任意の値を返します。

+0

ありがとう、両方の答えは完全に動作します:私は@Gordon Linoffの答えを正しいものとしてマークします。 –

0

nomに返される値がであることがわかりません。です。 MAX()集計では、問合せですべての行が折りたたまれ、平均値の最大値が選択されます。その部分は機能しています。

しかしnomに対して返される値であるから折り畳まグループ内の一部の行、必ずしもavgの最高値を有する行。クエリは基本的に、MySQLにnomという値をから、グループ内のいずれかの行に返すように指示しました。

他のデータベースには、「SELECTリストにないGROUP BYで非集合」の線に沿って、エラーメッセージを表示して、クエリでエラーをスローします。

非標準のMySQL固有の拡張では、クエリを実行できます。 (拡張子がdisabledの場合、MySQLは他のデータベースと同じように動作し、エラーを返すようになります(ONLY_FULL_GROUP_BYをsql_modeに含めると、他のデータベースと同様に、MySQLを標準に近づけることができます)。)

これは、あなたが観察する「予期しない」動作の理由です。

(これは、あなたが尋ねた質問に答える...何が悪かったのかを説明する。)

-1

ちょうど二つのフィールドの合計がすべての行に2つのフィールドのhigest和に等しい行をリストアップ。あなたは2つに分割する必要はありません。それはスケーリングだけです。

Select * from table 
Where noteOrale + noteEcrit = 
    (Select Max(noteOrale + noteEcrit) 
    From table) 

計算されたavgも出力に含めたい場合は、それをselect句に追加します。

Select nom, noteOrale, noteEcrit, 
    (noteOrale + noteEcrit)/2 Avg 
from table 
Where noteOrale + noteEcrit = 
    (Select Max(noteOrale + noteEcrit) 
    From table) 
関連する問題