Mysql 从联接中选择所有用户的最后5个位置

Mysql 从联接中选择所有用户的最后5个位置,mysql,Mysql,我有两个表:玩家位置记录所有玩家的gps坐标,玩家记录每个玩家的数据 球员 玩家id,玩家名称 球员位置 玩家id,玩家lat,玩家lon,时间戳 我想为所有球员争取最后5个位置 我选择一个玩家最后位置的第一个查询是: 从player_id=1的player_位置按时间戳DESC LIMIT 5选择* 但是我不知道如何复制这个查询来提取所有玩家的数据。我相信我必须在以前的连接中进行选择,但不确定如何编写它 谢谢。试试这个: SELECT pp.* , p.player_name FRO

我有两个表:玩家位置记录所有玩家的gps坐标,玩家记录每个玩家的数据

球员 玩家id,玩家名称

球员位置 玩家id,玩家lat,玩家lon,时间戳

我想为所有球员争取最后5个位置

我选择一个玩家最后位置的第一个查询是:

从player_id=1的player_位置按时间戳DESC LIMIT 5选择*

但是我不知道如何复制这个查询来提取所有玩家的数据。我相信我必须在以前的连接中进行选择,但不确定如何编写它

谢谢。

试试这个:

  SELECT pp.* , p.player_name 
  FROM player_positions pp 
  INNER JOIN  players p ON p.player_id = pp.player_id
  GROUP BY pp.player_id 
  ORDER BY pp.timestamp DESC LIMIT 5
编辑:


您可以模拟其他数据库中的rownumber函数来解决这个问题

SELECT 
    player_id,
    player_lat,
    player_lon,
    `timestamp`
FROM 
    (SELECT 
        pp.player_id, 
        pp.player_lat,
        pp.player_lon,
        pp.`timestamp`,
        @rn := if(@prev = pp.player_id, @rn + 1,1) as rn,
        @prev:=pp.player_id

    FROM
        Player_Positions as pp
        JOIN (SELECT @Prev:= Null, @Rn := 0) as v
    ORDER BY 
        pp.player_id,
        pp.timestamp desc) as t
WHERE
    rn <= 5;

请注意,如果出于某种原因,第5个数据库出现平局,则数据库将任意选择一个。因为一个球员不可能在同一个时间戳内处于两个位置,所以你应该没事

这将创造最多5个记录,但不是每个球员5个。感谢您的回复,但似乎每个球员只能获得一个结果。抱歉,因为不清楚,我希望所有球员都能获得最后5个位置,因此如果我有3名球员,我将获得15个结果。幸运的是,还是不行。它不会返回任何结果,如果我使用HAVING COUNT*<5,我只会得到与前面示例相同的数据。你有一个小提琴的例子吗?@Adrian:看一看@VMai,我想我一定是做错了什么,因为当我加入不等式时,我得到了0个结果。。。我会继续尝试:那么我们可以把它作为一个复制品关闭吗?这太棒了,正是我想要的。我以前没有使用过用户定义的变量,但我想我理解它是如何工作的。非常感谢。
SELECT 
    player_id,
    player_lat,
    player_lon,
    `timestamp`
FROM 
    (SELECT 
        pp.player_id, 
        pp.player_lat,
        pp.player_lon,
        pp.`timestamp`,
        @rn := if(@prev = pp.player_id, @rn + 1,1) as rn,
        @prev:=pp.player_id

    FROM
        Player_Positions as pp
        JOIN (SELECT @Prev:= Null, @Rn := 0) as v
    ORDER BY 
        pp.player_id,
        pp.timestamp desc) as t
WHERE
    rn <= 5;