【问题标题】:Trying to distinguish between two 2 variables Java试图区分两个2变量Java
【发布时间】:2019-04-10 15:20:12
【问题描述】:

我试图显示两支选定球队之间获胜和平局的百分比,但我发现很难区分任何一支球队。

Connection con = DBConnector.connect();
             ResultSet rs = con.createStatement().executeQuery("SELECT DISTINCT t1.title AS title1, t2.title AS title2, g.score1, g.score2, g.winner AS winner, g.team1_id AS team1,  g.home AS home FROM games g INNER JOIN teams AS t1 ON g.team1_id = t1.id INNER JOIN teams AS t2 ON g.team2_id = t2.id WHERE (t1.title = '"+team1 +"' AND t2.title = '" +team2+ "') OR (t1.title = '"+team2 +"' AND t2.title = '" +team1+ "');");
            while(rs.next()){

                if(rs.getString("team1").equals(rs.getString("home"))){
                if(rs.getInt("winner") == 1){
                        teamOneWin++;
                    }else{
                        teamTwoWin++;
                    }

                }else if(rs.getInt("winner") == 2){
                    if(rs.getString("team1").equals(rs.getString("home"))){
                        teamOneWin++;
                    }else{
                        teamTwoWin++;
                    }

                }else if(rs.getInt("winner") == 0){
                    if(rs.getString("team1").equals(rs.getString("home"))){
                    draw++;
                    }


            }

我正在检查查询中的 team1 值是否等于查询中的主队值。如果它们相等并且团队 1 是列获胜者中的值,我希望 teamOneWin 增加。我指定获胜者 1、获胜者 2 和获胜者 0(比赛为平局)。我指定这些是因为我有一个未播放的获胜者 3 值。

我知道下面这行是有缺陷的,因为 team1 总是等于主队,但我需要一种方法来区分任何一支球队并根据获胜者的价值增加正确的球队。

if(rs.getString("team1").equals(rs.getString("home"))){

在我的 SQL 中使用 COUNT 会更好吗?

这是我的游戏桌的表格结构:

CREATE TABLE "games" (
    "team1_id"  integer NOT NULL,
    "team2_id"  integer NOT NULL,
    "home"  integer,
    "score1"    varchar DEFAULT null,
    "score2"    varchar DEFAULT null,
    "winner"    integer,
    "created_at"    DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY("team1_id","created_at"),
    FOREIGN KEY("team1_id") REFERENCES "teams"("id"),
    FOREIGN KEY("team2_id") REFERENCES "teams"("id")
);

这是我的团队的表结构:

CREATE TABLE "teams" (
    "id"    integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "title" varchar NOT NULL,
    "code"  varchar,
    "synonyms"  varchar,
    "address"   varchar,
    "web"   varchar,
    "created_at"    DATETIME DEFAULT CURRENT_TIMESTAMP
);

非常感谢。

【问题讨论】:

  • 这似乎是在 SQL 中使用 COUNTs 而不是从数据库中加载所有数据并在 Java 中手动计算它会更好。
  • 计数是否会与我的 if 完全相同,其中获胜者等于数字和团队 ID?
  • 一切都取决于您如何编写 SQL - 如果您在问题中包含 gamesteams 表的表结构(包括数据类型和任何外键关系)可能会有所帮助
  • 请检查我的编辑,我刚刚包含了两者。
  • 我认为您真正遇到的问题是您的数据模型无法让您非常容易地获取您想要获取的数据。与其在winner 列中使用值3 来指示尚未玩过游戏,不如创建一个BIT 列来告诉您是否玩过该游戏。这使您可以将获胜团队的 ID 存储在 winner 列中(如果平局,则将其留空),这使您更容易收集统计数据,因为您现在可以计算给定 teamId 所在的行数在这两支球队正在比赛的winner 列中。

标签: java if-statement


【解决方案1】:

据我了解,在games 表的winner 列中,您存储了一个整数值,表示:

0: draw
1 or 2: either team won
3: game not played 

如果是这种情况,那么我认为您无需从数据库中获取数据并遍历每一行即可获得所需的结果。
试试这个查询:

select 
  t.title1, t.title2,
  100.0 * t.draws / (t.draws + t.wins) percentdraws,
  100.0 * t.wins / (t.draws + t.wins) percentwins
from (
  select 
    'team1' title1, 'team2' title2,
    sum(case when g.winner = 0 then 1 else 0 end) draws,
    sum(case when g.winner <> 0 then 1 else 0 end) wins
  from games g 
  inner join teams t1 on t1.id = g.team1_id 
  inner join teams t2 on t2.id = g.team2_id
  where 
    ((t1.title = 'team1' and t2.title = 'team2') or (t2.title = 'team1' and t1.title = 'team2'))
    and 
    g.winner < 3
) t  

'team1''team2' 更改为所选团队的名称。

【讨论】:

  • 这正是我需要的,谢谢。我对此查询进行了一些更改,例如添加了 team1 wins 和 team2。如果值为 null,我如何使 percentdraws、percentwinsone 或 percentwinstwo 等于 0?
  • 怎么可能为空?
  • 如果说其中一支球队没有获胜
  • 在 sql 中,当它为空时,您可以使用 coalesce() 将任何内容转换为 0,例如 coalesce(something, 0)。如果不为 null,则返回 something;如果为 null,则返回 0。
  • 所以像 coalesce(100.0 * t.draws / (t.draws + t.onewins + t.twowins, 0)) percentdraws ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多