2016-07-24 16 views
1

3つのテーブルがあります。私がこのクエリを使用していますLEFT JOINを使用してクエリに列を追加します。

tblcandidates

candidateid  |  candidatename 
1    |  Abc 
2    |  Def 

tbljudges

judgeid   |  judgename 
1    |  Stack 
2    |  Overflow 

tblscores

scoreid   |  candidateid  |  judgeid  |  swimsuit 
1    |  1    |  1   |  100 
2    |  1    |  2   |  99 
3    |  2    |  1   |  100 
4    |  2    |  2   |  93 

各候補の平均を取得します。

SELECT DISTINCT 
    (c.candidateid) AS c, 
    candidatename AS NAME, 
    j1.swimsuit AS j1, 
    j2.swimsuit AS j2, 
    (
     j1.swimsuit + j2.swimsuit 
    )/2 AS average 
FROM 
    tblscores, 
    tblcandidates c 
LEFT JOIN tblscores j1 ON c.candidateid = j1.candidateid 
AND j1.judgeid = 1 
LEFT JOIN tblscores j2 ON c.candidateid = j2.candidateid 
AND j2.judgeid = 2 
WHERE tblscores.candidateid = c.candidateid; 

出力

c  |  name  |  j1  |  j2  |  average 
1  |  Abc  |  100  |  99  |  99.5 
2  |  Def  |  100  |  93  |  96.5 

私の問題は、裁判官が3になった場合、私は裁判官の数に応じて、私のクエリを動的にしたいものです。私の質問は2人の裁判官に限られています。私はまた、彼らがスコアを持っているという証拠のために、審査員の得点を私の出力のように表示したい。

+2

sql fiddleを共有してください。これはMySQLピボットテーブルの問題です。 – 1000111

+0

どのようにSQLのフィドルを作る? –

+0

サンプル[** sql fiddle **](http://sqlfiddle.com/#!9/3fd52/1/0) – 1000111

答えて

3

平均計算を自分で実行することで、ここでホイールを再発明しています。代わりに、MySQLの組み込み集合体avgを使用することができます。本当にすべての得点が欲しい場合は、group_concatを使用して表示することができます。

SELECT c.candidateid AS id, 
     candidatename AS name, 
     GROUP_CONCAT(swimsuit) AS all_scores, 
     AVG(swimsuit) AS average_score 
FROM  tblcandidates c 
JOIN  tblscores s ON c.candidateid = s.candidateid 
GROUP BY c.candidateid, candidatename 
+0

申し訳ありません。私はすべての審査員のスコアを表示しなければならないことを忘れていました。私の出力のように。 –

+0

@SeeMore 'group_concat'を呼び出すと、すべての個々の得点が表示されます。別の列にそれらが必要な場合は、これまでのように選択リストにアイテムを追加し続けるしかありません。 – Mureinik

+1

大丈夫です。私はそれを試しました。すべての得点がコンマで表示されています、ありがとうございました。おそらく、私はちょうどPHPのすべてのそれらを今のところ取得するために爆発を使用します。私は他のいくつかの答えを待つつもりですが、あなたの答えは有用です。ありがとうございました。 –

関連する問題