sql - 如何为这个逻辑(has_many、belongs_to 关联)编写 SQL 查询?

标签 sql mysql

此 SQL 查询的目标是返回赢得战斗次数最多的用户以及获胜次数。

我有两个表:用户和战斗。

用户有很多争吵 战斗属于用户

战斗有以下几列值得关注:

  • challenger_id(user_id fk)
  • challengee_id(user_id fk)
  • challenger_won( bool 值)

如您所见,用户可以是挑战者或挑战者,但不能两者兼而有之。

  • 如果用户是挑战者并且challenger_won = true,则视为获胜。
  • 如果用户是挑战者并且challenger_won = false,则视为获胜。
  • 如果challenger_won = null,则忽略它。

我该如何为此编写 SQL?

最佳答案

这个怎么样?

SELECT a.fighter, COUNT(*) AS wins
  FROM (SELECT challenger_id AS fighter
          FROM fights
         WHERE challenger_won = TRUE
        UNION ALL
        SELECT challengee_id AS fighter
          FROM fights
         WHERE challenger_won = FALSE
       ) AS a
 GROUP BY a.fighter;

如果 challenger_won 为 NULL,则 UNION 中的两个查询都将根据需要忽略该行。

如果您不喜欢 UNION ALL,您可以使用:

SELECT a.fighter, SUM(a.wins) AS wins
  FROM (SELECT challenger_id AS fighter, 'R' AS role, COUNT(*) AS wins
          FROM fights
         WHERE challenger_won = TRUE
         GROUP BY fighter, role
        UNION
        SELECT challengee_id AS fighter, 'E' AS role, COUNT(*) AS wins
          FROM fights
         WHERE challenger_won = FALSE
         GROUP BY fighter, role
       ) AS a
 GROUP BY a.fighter;

UNION 的第一部分生成以“R”为角色的行(代表“challengeR won”)以及战斗机 ID 和获胜的战斗计数。第二部分生成以“E”为角色(代表“challengeE won”)的行以及战斗机 ID 和获胜的战斗计数。如果某个拳手作为挑战者赢得了 3 场比赛,并且作为挑战者赢得了 3 场比赛,则该角色是必要的;如果没有这个角色,具有相同战斗机和计数的两个条目将被合并为一个。然后,您可以总结每个角色中每个战士的胜利。

关于sql - 如何为这个逻辑(has_many、belongs_to 关联)编写 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910462/

相关文章:

mysql - 从 mySQL 中的单个表行中选择两行

mysql:显示表-定义列名

LIKE 之间的 SQL Server 日期

php - 如何多次添加多个用户

mysql - MySQL 中何时使用单引号、双引号和反引号

sql - 错误 : bind message supplies 1 parameters, 但准备好的语句 ""需要 0

MySQL 事务不返回任何行

mysql - 从 Oracle 过渡到 MySQL 的注意事项

MYSQL 截断不正确的 DOUBLE 值 : Upon multiplying

MySQL 查询、数据透视表