2016-07-24 199 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小提琴。这是一个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。我会等待一些其他答案,但你的答案是有帮助的。谢谢。 –