SQL:打破平局

时间:2016-11-30 22:49:32

标签: mysql sql triggers

我有一个像Major League Baseball一样的SQL数据库。它有一个美国联盟和国家联盟,其中包含分区,其中包含有赢/输记录并包含球员的球队。

我的联赛表有:| league_name | league_id(主键)|外卡|

如果外卡是外键团队ID,那么该部门中最好的团队并不领导该部门。

当我更新我的Z_TEAMS表(保存赢/输记录)时,这是我更新通配符的触发器:

UPDATE Z_LEAGUES
SET `Z_LEAGUES`.`Wild Card` = (SELECT teamID
                           FROM Z_TEAMS
                           WHERE (teamWins/teamLoss) = 
                           (SELECT MAX(teamWins/teamLoss) FROM Z_TEAMS, 
                           Z_DIVISIONS WHERE Z_TEAMS.divID = 
                           Z_DIVISIONS.divID AND Z_DIVISIONS.leagueID = 
                           Z_LEAGUES.leagueID AND Z_TEAMS.teamID != Z_DIVISIONS.divLeader))

通常效果很好,每次更新Z_TEAMS时都会选择正确的团队。但是,如果我尝试更新Z_TEAMS以便2个团队具有相同的记录并且两者都是通配符的候选者,则触发器将返回多行并限制更新。

我的问题是:如何打破这种关系?我愿意在外卡位置展示两支球队,或者随意挑选一支球队,或者按字母顺序挑选。我对SQL很陌生,无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

UPDATE Z_LEAGUES
SET `Z_LEAGUES`.`Wild Card` = 
(SELECT teamID
 FROM Z_TEAMS
 WHERE (teamWins/teamLoss) = 
    (SELECT MAX(teamWins/teamLoss) 
     FROM Z_TEAMS, Z_DIVISIONS 
     WHERE Z_TEAMS.divID = Z_DIVISIONS.divID 
       AND Z_DIVISIONS.leagueID = Z_LEAGUES.leagueID 
       AND Z_TEAMS.teamID != Z_DIVISIONS.divLeader)
 ORDER BY teamID
 Limit 1)

在您的基本查询中添加了最后两行。

限制将限制输出行,并且将按顺序排序它们以便选择哪一行的可预先性。

您可以使用order by teamID desc反向排序。