此 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/