Mysql SQL查询比较不同行中的数据
我昨天在一次求职面试中提出了这个问题,虽然看起来很直截了当,但我还是想不出来,而且我整晚都在想这个问题 系统记录有关拼字游戏联盟的数据。该联盟有一个成员表、一个游戏表和一个加入成员的游戏表Mysql SQL查询比较不同行中的数据,mysql,sql,Mysql,Sql,我昨天在一次求职面试中提出了这个问题,虽然看起来很直截了当,但我还是想不出来,而且我整晚都在想这个问题 系统记录有关拼字游戏联盟的数据。该联盟有一个成员表、一个游戏表和一个加入成员的游戏表 members: member_id, name : pk(member_id) member_games: game_id, member_id, score : pk(game_id, member_id) games: game_id, location, date : pk(game_id) mem
members: member_id, name : pk(member_id)
member_games: game_id, member_id, score : pk(game_id, member_id)
games: game_id, location, date : pk(game_id)
members
1, mick
2, keith
3, charlie
member_games
1, 1, 50
1, 2, 60
2, 1, 45
2, 3, 105
3, 1, 30
3, 3, 120
game
1, london, 2012-12-01
2, richmond, 2012-12-02
3, leeds, 2012-12-03
如何制定一个SQL查询,以找出成员的获胜次数_id=1?这应该符合SQL Server语法
SELECT member_id
,COUNT(*) Wins
FROM (
SELECT member_id
,RANK() OVER (PARTITION BY Game_Id ORDER BY score DESC) Position
FROM member_games
) Positions
WHERE Position=1
AND
member_id=1
GROUP BY member_id
等级考虑到在拼字游戏中可能出现的联系(如果不太可能的话)。在不可能打成平局的游戏中,ROW_NUMBER可以提供少量性能提升
该方法可以很容易地扩展,以显示所有标签
SELECT member_id
,Position
,COUNT(*) Games
FROM (
SELECT member_id
,RANK() OVER (PARTITION BY Game_Id ORDER BY score DESC) Position
FROM member_games
) Positions
WHERE member_id=1
GROUP BY member_id
,Position
请参见SQL Fiddle关键是首先对成员游戏进行分组并获得最高分数,然后将其加入到成员游戏表以获得成员id 事实上,您需要一个左连接才能看到成员id赢得0场比赛
SELECT
member_games.member_id
,COUNT(BestScore.game_id)
FROM member_games
LEFT JOIN
(
SELECT game_id, MAX(score) AS HighestScore FROM member_games GROUP BY Game_ID
) BestScore ON member_games.Score = BestScore.HighestScore
AND member_games.game_id = BestScore.game_id
WHERE member_games.member_id = 1
GROUP BY member_games.member_id;
这里是MySQL
此解决方案将平局视为胜利,但它应该适用于任何SQL server。Microsoft SQL Server 2005及更高版本中提供了秩函数
为了完整起见,这里有一个更复杂的查询,它不将平局计算为胜利:
SELECT
member_games.member_id
,COUNT(BestScore.game_id)
FROM member_games
LEFT JOIN
(
SELECT member_games.game_id, HighestScore
FROM member_games
LEFT JOIN
(
SELECT game_id, MAX(score) AS HighestScore FROM member_games GROUP BY Game_ID
) BestScore ON member_games.Score = BestScore.HighestScore
AND member_games.game_id = BestScore.game_id
GROUP BY game_id, HighestScore
HAVING count(1) = 1
) BestScore ON member_games.Score = BestScore.HighestScore
WHERE member_games.member_id = 1
GROUP BY member_games.member_id;
在as MySQL上绑定为损失查询以查找成员_id=1的赢数
以下查询将为您提供成员_id 1的获胜次数
select count(*) as number_of_wins
from member_games as mg1
where member_id = 1
and not exists (select 1
from member_games as mg2
where mg2.game_id = mg1.game_id
and mg2.member_id <> mg1.member_id
and mg2.score >= mg1.score);
下面的查询将为您提供成员列表及其各自的获胜次数
select m.*,
(select count(*) from member_games as mg1
where member_id = m.member_id
and not exists (select 1
from member_games as mg2
where mg2.game_id = mg1.game_id
and mg2.member_id <> mg1.member_id
and mg2.score >= mg1.score)
) as number_of_wins
from members as m;
这些查询不考虑与WINS首当其冲的关系。
我创建了一个和一个。哦,所以你回答了,因为它与体育有关@他056哈哈,这就是我的名声,嗯P很高兴在这里见到你’:‘对不起,mysql。使用最大平局数作为胜利吗?是的,它将平局数作为平局数。谢谢,有没有办法把平局数考虑在内,我想他们会把这算作胜利的召唤。我只是编辑了一下,把平局算作损失。GMM打败了我,而且字符数更少。酷,使用最大计数抽奖作为胜利的解决方案,这个解决方案没有t@jx12345:事实上,我最初的回答确实将平局视为胜利,但现在我知道你不想将平局视为胜利,我将>改为>=现在它不将平局视为胜利。
select m.*,
(select count(*) from member_games as mg1
where member_id = m.member_id
and not exists (select 1
from member_games as mg2
where mg2.game_id = mg1.game_id
and mg2.member_id <> mg1.member_id
and mg2.score >= mg1.score)
) as number_of_wins
from members as m;