从桌上锦标赛和最大赢家玩家中选择不同的列
Posted
技术标签:
【中文标题】从桌上锦标赛和最大赢家玩家中选择不同的列【英文标题】:Select distinct columns from table tournament and max winner player 【发布时间】:2021-04-03 08:16:03 【问题描述】:我搜索了一下,没有答案,我正在做一个练习,我有 4 张桌子
表“比赛作为t”
ID | NAME | CODE |
---|---|---|
1 | Roland Garros | RG |
2 | Australian open | AO |
3 | US open | US |
4 | Wimbledon | WI |
...
表“试用为e”
ID | YEAR | GENDER_TRIAL | ID_TOURNAMENT (fk_toTournament) |
---|---|---|---|
1 | 2010 | Male | 1 |
2 | 2010 | Female | 1 |
3 | 2011 | Female | 2 |
4 | 2011 | Male | 2 |
5 | 2011 | Male | 1 |
...
表格“match_tennis as mt”
ID | ID_trial (fk_toTrial) | ID_winner (fk_toPlayer) | ID_loser (fk_toPlayer) |
---|---|---|---|
1 | 2 | 1 | 2 |
2 | 3 | 3 | 1 |
3 | 1 | 2 | 3 |
...
表“玩家作为 p” |身份证 |姓名 |性别 | |:--:|:---------------:|:------:| | 1 |拉斐尔·纳达尔 |男 | | 2 |罗杰·费德勒 |男 | | 3 |塞雷娜·威廉姆斯 |女 | | 2 |威廉姆斯维纳斯 |女 |
...
所以我的表有很多记录,预期的结果是
ID (t.id) | Tournament (t.Name) | Code (t.Code) | Female Player with most wins (p.Name) | Wins (MAX(COUNT(WINNER))) | Male Player with most wins (p.Name) | Wins (MAX(COUNT(WINNER))) |
---|---|---|---|---|---|---|
1 | Roland Garros | RG | Serena Williams | 5 | Rafael Nadal | 7 |
2 | Australian open | AO | Venus Williams | 3 | Roger Federer | 9 |
3 | US open | US | Simona Halep | 7 | Novak Djokovic | 5 |
4 | Wimbledon | WI | Wozniacki Caroline | 3 | Andy Murray | 4 |
类似的东西......我无法更改我的数据库表,到目前为止,我得到了所有锦标赛以及每个玩家的所有胜利
我的查询是这样的
SELECT t.id, t.name, t.code, p.name, COUNT(*) as wins "
+ "FROM tournament t "
+ "INNER JOIN trial e ON e.id_tournament = t.id "
+ "INNER JOIN match_tennis mt ON mt.id_trial = e.id "
+ "INNER JOIN player p ON mt.id_winner = p.id "
+ "GROUP BY t.name, p.name "
+ "ORDER BY wins DESC";
我有这样的东西作为预期的输出
【问题讨论】:
见meta.***.com/questions/333952/… 1.至少,样本数据Table "match_tennis as mt"
与您的预期结果不匹配。 2. 你的 mysql 是什么版本的?
我是 *** 的新手。我的意思是,发布问题,就像我的第三个问题一样...关于表格,我可以为您提供创建和填充数据库的查询,但我知道如何.. . 预期的结果是和示例它与其他表格无关,实际上 match_tennis 也不是......我将对其进行编辑以清除。
【参考方案1】:
您需要首先考虑如何获得每个玩家/锦标赛组合的获胜次数。
SELECT t.id, t.name, t.code, e.gender_trial, p.name as player_name, COUNT(*) as wins
FROM tournament t INNER JOIN
trial e
ON e.id_tournament = t.id INNER JOIN
match_tennis mt
ON mt.id_trial = e.id INNER JOIN
player p
ON mt.id_winner = p.id
GROUP BY t.id, t.name, t.code, e.gender_trial, p.name;
这与您的查询非常相似,但GROUP BY
和SELECT
是一致的,并且还包括性别。
有了这个结果,你可以做两件事。第一个是按性别计算第一个。第二个是将每个锦标赛聚合成一行。所以:
WITH tp as (
SELECT t.id, t.name, t.code, e.gender_trial, p.name, COUNT(*) as wins
FROM tournament t INNER JOIN
trial e
ON e.id_tournament = t.id INNER JOIN
match_tennis mt
ON mt.id_trial = e.id INNER JOIN
player p
ON mt.id_winner = p.id
GROUP BY t.id, t.name, t.code, e.gender_trial, p.name
)
SELECT t.id, t.name, t.code,
MAX(CASE WHEN seqnum = 1 AND gender_trial = 'Female' THEN player_name END)) as female_first,
MAX(CASE WHEN seqnum = 1 AND gender_trial = 'Female' THEN wins END)) as female_wins,
MAX(CASE WHEN seqnum = 1 AND gender_trial = 'Male' THEN player_name END)) as male_first,
MAX(CASE WHEN seqnum = 1 AND gender_trial = 'Male' THEN wins END)) as male_wins
FROM (SELECT tp.*,
ROW_NUMBER() OVER (PARTITION BY id, gender_trial ORDER BY wins DESC) as seqnum
FROM tp
) tp
GROUP BY t.id, t.name, t.code;
【讨论】:
感谢您的回答,但不幸的是它不起作用,我写的完全一样,它告诉我一个错误“重复的列名'name'”。 @TiagoVieira 。 . .我错过了您在查询中两次使用name
。
我在male_first 和male_wins 上得到空值...如果我没记错的话,分区子句是按锦标赛及其性别划分所有结果,对吧?所以我们有一个列,即所有 Roland Garros 和女性球员的列,并且每次 row_number 获得该分区的第一行时,它定义了 de max wins 和 player_name,还是我错了?我刚刚看到一个 youtube 视频,因为它对我来说是全新的......无论如何它对女性有好处,但男性发送的是 null。
NVM 我的错,我拼错了“男性”:D 天哪,先生,你太棒了,我希望我能达到你的水平 :) 非常感谢你,非常感谢你的帮助。以上是关于从桌上锦标赛和最大赢家玩家中选择不同的列的主要内容,如果未能解决你的问题,请参考以下文章
选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列