mysql - SQL:打破平局

标签 mysql sql triggers

我有一个结构类似于美国职业棒球大联盟的 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 的新手,无法弄清楚这一点。

最佳答案

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)

将最后两行添加到您的基本查询中。

Limit 将限制输出行,而 order by 将对它们进行排序以预测将选择哪一行。

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

关于mysql - SQL:打破平局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40899694/

相关文章:

SQL 计数为零值

MySQL 触发器 - 5.7.23-0ubuntu0.16.04.1 - 奇怪的行为并非每次都有效

MySQL 触发器语法错误 #1064

mysql - MySQL数据库的正确设计

Mysql Left Join 最后一条记录

MySQL插入后触发

PostgreSQL 触发器阻止另一个触发器工作

mysql - 使用ORM时是否需要定义schema才能插入数据

SQL:通过多个表获取客户的总份额

sql - 将 key 获取到 postgres 中的 JSON 字段