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;