2013-12-08 94 views
1

我想这取决于条件,如果player_id(加里) 具有大于,等于或小于得分,然后player_id(“其他”)聚合条件?

我的架构具有

players(player_id, name) 

matches(match_id, home_team(player_id), away_team(player_id)) 

outcome(outcome_id, match_id, home_score:integer, away_score:integer 

输出汇总:

select m.match_id, p.name AS home_team, p1.name AS away_team, o.home_score, o.away_score 
from players p 
inner join matches m on (p.player_id = m.home_team) 
inner join players p1 on (p1.player_id = m.away_team) 
inner join outcomes o on (m.match_id = o.match_id); 

match_id | player_id | player_id | home_score | away_score 
----------+-----------+-----------+------------+------------ 
     1 | 1   | 2   |   1 |   2 
     2 | 2   | 1   |   1 |   3 
     3 | 3   | 1   |   3 |   2 

求购输出:

player_id | Wins | Draws | Losses 
-------------+------+-------+-------- 
    1   | 1 | 0 | 2 
    2 ... | ... | .. | ... 

我的模式是可以修改的。

EDIT(sqlfiddle):http://www.sqlfiddle.com/#!2/7b6c8/1

+0

啊遗憾的含混,这事doesent!重点更多的是赢得每场比赛的胜利和抽奖次数@Filipe Silva – skyw00lker

+1

您可以在您的原始表格样本数据中添加[sqlfiddle](http://www.sqlfiddle.com)吗? –

+0

会做! @FilipeSilva – skyw00lker

回答

1

我会用UNION ALL让每一个outcome两次,一次为home,一次为away玩家。应该切换第二次home_score/away_score,以获得away玩家的正确金额。

select 
    d.player_id, 
    d.name, 
    sum(d.home_score > d.away_score) as wins, 
    sum(d.home_score = d.away_score) as draws, 
    sum(d.home_score < d.away_score) as loses 
from (
    select p.player_id, p.name, o.home_score, o.away_score 
    from players p 
    join matches m on p.player_id = m.home_team 
    join outcomes o on o.match_id = m.match_id 
    union all 
    select p.player_id, p.name, o.away_score as home_score, o.home_score as away_score 
    from players p 
    join matches m on p.player_id = m.away_team 
    join outcomes o on o.match_id = m.match_id) d 
group by d.player_id, d.name 

返回:

PLAYER_ID NAME WINS DRAWS LOSES 
1   Gary 1  0  2 
2   Tom  1  0  1 
3   Brad 1  0  0 

sqlFiddle演示:http://www.sqlfiddle.com/#!2/7b6c8/21

+0

非常感谢!这非常有帮助,并得到了预期的结果,但我不知道我的模式是否正确设置了回答这种查询! @MarcinJuraszek – skyw00lker

1

对于一个解决方案,而子查询和工会:http://www.sqlfiddle.com/#!2/7b6c8/31

SELECT 
    p.player_id, 
    COALESCE(SUM(o1.home_score > o1.away_score or o2.home_score < o2.away_score), 0) wins, 
    COALESCE(SUM(o1.home_score = o1.away_score or o2.home_score = o2.away_score), 0) draws, 
    COALESCE(SUM(o1.home_score < o1.away_score or o2.home_score > o2.away_score), 0) losses 
FROM players p 
LEFT JOIN matches m1 ON (p.player_id = m1.home_team) 
LEFT JOIN players p1 ON (p1.player_id = m1.away_team) 
LEFT JOIN outcomes o1 ON (m1.match_id = o1.match_id) 
LEFT JOIN matches m2 ON (p.player_id = m2.away_team) 
LEFT JOIN players p2 ON (p2.player_id = m2.home_team) 
LEFT JOIN outcomes o2 ON (m2.match_id = o2.match_id) 

GROUP BY p.player_id  

结果:

PLAYER_ID WINS DRAWS LOSSES 
1 1 0 2 
2 1 0 1 
3 1 0 0 
4 0 0 0 
5 0 0 0 
+0

这不会像预期的那样返回结果恐怕应该是Marcin的answare @Wolph – skyw00lker

+0

的确,我忘了反向关系:)我已经添加了一个修改版本。我个人不是联盟的粉丝,所有的方法 – Wolph

+0

啊好!谢谢你的解决方案,我从这两个例子中学到了很多! 我想把你的answare作为解决方案,但marcin解决了它“更快”,在制作中,我想我会和你一起去,尽管@Wolph – skyw00lker