【问题标题】:Select results from specified year选择指定年份的结果
【发布时间】:2019-10-24 08:49:34
【问题描述】:

我希望以下查询仅选择特定年份的结果。 eventID 与事件日期所在的事件表相关。

冠军排行榜表

 ------------------------------------
 | ID | eventID | playerId | points |
 ------------------------------------

事件表

 ------------------
 | eventID | date |
 ------------------

我无法确定内部连接的放置位置,以便正确引用事件日期

SELECT playerId, SUM(points) top5
FROM
 ( SELECT x.*
        , CASE WHEN @prev = playerId THEN @i:=@i+1 ELSE @i:=1 END i
        , @prev:=playerId
     FROM championshipLeaderboard x
        , (SELECT @prev:=null,@i:=0) vars ORDER BY playerId,points
DESC) a
    WHERE i<=5 AND playerId = 1 AND YEAR(events.date) = YEAR(CURDATE()) 
    GROUP BY playerId
    ORDER BY top5 DESC

见 DB fiddle here

【问题讨论】:

  • 你在使用 MySQL 8+ 吗?
  • 服务器版本:5.7.23 - MySQL 社区服务器 (GPL)
  • 请共享表数据和预期结果集。而不是共享查询来修改使其成为已尝试的查询。

标签: mysql


【解决方案1】:

经过一些讨论(见 cmets)我想出了这个:

SELECT top5.playerId, SUM(top5.points) AS sumOfPoints
FROM (
    SELECT playerId, points
    FROM championshipLeaderboard
    INNER JOIN events ON championshipLeaderboard.eventID = events.eventID
    WHERE playerId = 1
    AND YEAR(events.date) = YEAR(CURDATE()) 
    ORDER BY points DESC
    LIMIT 5
 ) AS top5
 GROUP BY top5.playerId

另请参阅:https://www.db-fiddle.com/f/56ApCUAW6QFJ7vNiyLQqaF/5

【讨论】:

  • 我需要每个玩家的前 5 名总和,最多 12 分
  • 对不起,我在这里没有得到你想要的东西。你有积分和事件。您想查看每个玩家的前 5 个事件的总和,然后将结果限制为 12 行吗?请澄清您的问题。
  • 每位选手每年参加 12 场赛事,并根据完成的位置获得积分。前 5 分相加。此代码正确执行,但现在我需要能够根据事件的播放年份选择结果
  • 如果您希望能够在不同年份运行上述选择,只需将 CURDATE() 替换为您需要的任何年份。
  • 我现在已经在我的问题中添加了小提琴......所以基本上当我们明年进入新赛季时,我需要能够指定比赛的年份,这样我就可以在我网站的存档部分使用
【解决方案2】:

您可以将内部连接与1=1 一起使用

    SELECT playerId, SUM(points) top5
FROM
 ( SELECT x.*
        , CASE WHEN @prev = playerId THEN @i:=@i+1 ELSE @i:=1 END i
        , @prev:=playerId
     FROM championshipLeaderboard x
     INNER JOIN events y ON x.event_id = y.event_id
     INNER JOIN (SELECT @prev:=null,@i:=0) vars ON 1=1
     WHERE YEAR(y.date) = YEAR(CURDATE())
     ORDER BY playerId,points DESC
 ) a
    WHERE i<=5 AND playerId = 1  
    GROUP BY playerId
    ORDER BY top5 DESC

【讨论】:

  • 谢谢拉基姆,我现在添加了一个数据库小提琴,当我使用你的答案时,top5 的计算是错误的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多