0

我有一张看起来像这样的桌子。每个 game_id 每 5 分钟更新一次

game_id 玩家日期
12 420 2013-06-19 12:30:00
13 345 2013-06-19 12:30:00
14 600 2013-06-19 12:30:00
12 375 2013-06-19 12:25:00     
13 475 2013-06-19 12:25:00
14 575 2013-06-19 12:25:00
12 500 2013-06-19 12:20:00
...

我需要查询每个游戏 ID,获取当前玩家(最新时间戳)和当天的最大值。所以结果看起来像这样

game_id 最大电流
12 500 420
13 475 345
14 600 600

我尝试过这样的事情,但是没有运气,无法弄清楚:(

select game_id, max(players) as max, player as current from players where date >= '2013-06-19' order by date desc group by game_id;

谢谢你的帮助!

4

4 回答 4

2

http://www.sqlfiddle.com/#!2/e5157/5

 select game_id, max(players) as maximum, 
players as current 
from tab where date >= '2013-06-19' 

group by game_id
于 2013-06-19T23:17:35.533 回答
1
select game_id, max(players) as max, players as current from players  where date >= '2013-06-19' group by game_id  order by date desc ;
于 2013-06-19T23:15:27.113 回答
1

要获得最后一个值,您需要一种或另一种技巧。此版本不使用连接,而是使用substring_index()/group_concat()技巧:

select game_id, max(players) as MaxPlayers,
       substring_index(group_concat(players order by date desc), ',', 1) + 0 as Latest
from players
group by game_id;

这种方法的好处是它可以保证工作并且不需要任何额外的连接。

特别是,它不使用允许列包含在select子句中而不包含在子句中的 MySQL 扩展group by如文档中明确说明的那样,当有多个值时,结果是不确定的:

您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。

于 2013-06-20T00:09:00.037 回答
0
select
  t.game_id
  , maxes.max_players as max
  , t.players as current_players as current
from
  (
    select
      t.game_id
      , max(t.players) as max_players
      , max(t.date) as max_date
    from
      t
    where
      t.game_id = :game_id
      and t.date >= :todays_date
    group by
      t.game_id
  ) maxes
  inner join t on t.game_id = maxes.game_id and t.date = maxes.max_date
where
  t.date >= :todays_date

我现在没有配置 mysql 数据库来测试这个,但我认为它会给你想要的结果。

于 2013-06-20T00:10:53.907 回答