首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能显示每个球员赢得的比赛、比赛的结果和比赛的结果

不能显示每个球员赢得的比赛、比赛的结果和比赛的结果
EN

Stack Overflow用户
提问于 2015-07-17 21:10:17
回答 1查看 423关注 0票数 1
代码语言:javascript
复制
CREATE TABLE matches (
  match_id BIGSERIAL PRIMARY KEY,
  tournamentid INTEGER,
  player1_id INTEGER,
  player2_id INTEGER CHECK (player1_id < player2_id),
  result INTEGER CHECK (result IN (0, 1, 2)),
  FOREIGN KEY(tournamentid, player1_id) REFERENCES enroll(tournament, player_id),
  FOREIGN KEY(tournamentid, player2_id) REFERENCES enroll(tournament, player_id),
  UNIQUE(tournamentid, player1_id, player2_id)
);   

CREATE VIEW player_standings AS (
SELECT tournaments.tournament_id,
     tournaments.tournament_name,
     enroll.player_id,
     players.name,
     CASE
          WHEN matches.result = 1 THEN COUNT(matches.player1_id)
          WHEN matches.result = 2 THEN COUNT(matches.player2_id)
          END AS wins,

     COUNT(enroll.player_id IN (matches.player1_id, matches.player2_id)) AS match_played

FROM players
  INNER JOIN enroll ON enroll.player_id = players.id
  INNER JOIN tournaments ON tournaments.tournament_id = enroll.tournament
  LEFT JOIN matches ON (matches.player1_id = enroll.player_id) or
       (matches.player2_id = enroll.player_id)

GROUP BY tournaments.tournament_id, tournaments.tournament_name,   
    enroll.player_id, players.name, matches.result
ORDER BY tournaments.tournament_id, wins DESC
);

我似乎无法正确地得到赢得比赛的次数。我认为这个问题与左键和火柴表有关。

这样做的目的是从matches表中读取列result,其中结果被解释为:

代码语言:javascript
复制
0 = draw
1 = player1 won
2 = player2 won 

使用当前模式,我可以正确地获得每个球员的比赛数,但不能得到所玩的比赛数。

如果可能的话,我也希望在不需要分解成多个视图或表的情况下添加平局的数量。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-19 19:00:58

由于您没有包含所有的模式,所以我做了一些有经验的猜测,并提出了一个我认为应该有效的观点。我包括了一些额外的损失计数和平局,同时我发现用视图中的所有结果来验证结果更容易。

代码语言:javascript
复制
CREATE VIEW player_standings AS (
SELECT 
      tournaments.tournament_id as t_id
    , tournaments.tournament_name
    , enroll.player_id
    , players.name
    , COUNT(
       CASE
        WHEN enroll.player_id = matches.player1_id AND matches.result = 1 THEN 1 
        WHEN enroll.player_id = matches.player2_id AND matches.result = 2 THEN 1 
       END) AS wins
    , COUNT(
       CASE
        WHEN enroll.player_id = matches.player1_id AND matches.result = 2 THEN 1 
        WHEN enroll.player_id = matches.player2_id AND matches.result = 1 THEN 1 
       END) AS losses
    , COUNT(CASE WHEN matches.result = 0 THEN 1 END) AS draws
    , COUNT(match_id) AS matches_played

FROM players
INNER JOIN enroll ON enroll.player_id = players.id
INNER JOIN tournaments ON tournaments.tournament_id = enroll.tournament
LEFT JOIN matches ON matches.tournamentid = tournaments.tournament_id 
                 AND enroll.player_id IN (matches.player1_id, matches.player2_id)
GROUP BY 
  tournaments.tournament_id, 
  tournaments.tournament_name, 
  enroll.player_id, 
  players.name
ORDER BY 
  tournaments.tournament_id, 
  wins DESC, 
  matches_played DESC
);

下面是我创建的SQL的标记输出:

SQL Fiddle

PostgreSQL 9.3架构设置

代码语言:javascript
复制
create table players (
  id int primary key, 
  name varchar(20)
);

insert into players values 
(1, 'Player 1'),(2, 'Player 2'),
(3, 'Player 3'),(4, 'Player 4'),(5, 'Player 5');

create table tournaments (
  tournament_id int primary key, 
  tournament_name varchar(20)
);

insert into tournaments values (1, 'Tournament 1'),(2, 'Tournament 2');

create table enroll (
  tournament int, 
  player_id int, 
  primary key (tournament, player_id),
  foreign key (tournament) references tournaments(tournament_id),
  foreign key (player_id) references players(id)
);

insert into enroll values 
(1,1),(1,2),(1,3),(1,4),(1,5),
(2,1),(2,2),(2,3),(2,4),(2,5);

CREATE TABLE matches (
  match_id bigserial PRIMARY KEY, 
  tournamentid INTEGER, 
  player1_id INTEGER, 
  player2_id INTEGER CHECK (player1_id < player2_id), 
  result INTEGER CHECK (result IN (0, 1, 2)),
  FOREIGN KEY(tournamentid, player1_id) REFERENCES enroll(tournament, player_id),
  FOREIGN KEY(tournamentid, player2_id) REFERENCES enroll(tournament, player_id),
  UNIQUE(tournamentid, player1_id, player2_id)
);

insert into matches (tournamentid, player1_id, player2_id, result) values 
 (1, 1, 2, 1) -- 1 win 2 loss
,(1, 1, 3, 1) -- 1 win 3 loss
,(1, 2, 3, 2) -- 2 win 2 loss
,(1, 1, 5, 1) -- 1 win 5 loss

,(2, 2, 4, 0) -- 2 draw 4 draw
,(2, 1, 2, 1) -- 1 win 2 loss
,(2, 3, 4, 2) -- 4 win 3 loss
;

CREATE VIEW player_standings AS (
SELECT 
      tournaments.tournament_id as t_id
    , tournaments.tournament_name
    , enroll.player_id
    , players.name
    , COUNT(
       CASE
        WHEN enroll.player_id = matches.player1_id AND matches.result = 1 THEN 1 
        WHEN enroll.player_id = matches.player2_id AND matches.result = 2 THEN 1 
       END) AS wins
    , COUNT(
       CASE
        WHEN enroll.player_id = matches.player1_id AND matches.result = 2 THEN 1 
        WHEN enroll.player_id = matches.player2_id AND matches.result = 1 THEN 1 
       END) AS losses
    , COUNT(CASE WHEN matches.result = 0 THEN 1 END) AS draws
    , COUNT(match_id) AS matches_played

FROM players
INNER JOIN enroll ON enroll.player_id = players.id
INNER JOIN tournaments ON tournaments.tournament_id = enroll.tournament
LEFT JOIN matches ON matches.tournamentid = tournaments.tournament_id 
                 AND enroll.player_id IN (matches.player1_id, matches.player2_id)
GROUP BY 
  tournaments.tournament_id, 
  tournaments.tournament_name, 
  enroll.player_id, 
  players.name
ORDER BY 
  tournaments.tournament_id, 
  wins DESC, 
  matches_played DESC
);

查询1

代码语言:javascript
复制
select * from player_standings

结果

代码语言:javascript
复制
| t_id | tournament_name | player_id |     name | wins | losses | draws | matches_played |
|------|-----------------|-----------|----------|------|--------|-------|----------------|
|    1 |    Tournament 1 |         1 | Player 1 |    3 |      0 |     0 |              3 |
|    1 |    Tournament 1 |         3 | Player 3 |    1 |      1 |     0 |              2 |
|    1 |    Tournament 1 |         2 | Player 2 |    0 |      2 |     0 |              2 |
|    1 |    Tournament 1 |         5 | Player 5 |    0 |      1 |     0 |              1 |
|    1 |    Tournament 1 |         4 | Player 4 |    0 |      0 |     0 |              0 |
|    2 |    Tournament 2 |         4 | Player 4 |    1 |      0 |     1 |              2 |
|    2 |    Tournament 2 |         1 | Player 1 |    1 |      0 |     0 |              1 |
|    2 |    Tournament 2 |         2 | Player 2 |    0 |      1 |     1 |              2 |
|    2 |    Tournament 2 |         3 | Player 3 |    0 |      1 |     0 |              1 |
|    2 |    Tournament 2 |         5 | Player 5 |    0 |      0 |     0 |              0 |
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31484776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档