2016-07-24 3 views
1

세 개의 테이블이 있습니다.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로 그들을 모두 얻을 폭발. 다른 답변이 나올 때까지 기다리 겠지만 답변이 도움이됩니다. 고맙습니다. –

관련 문제