Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用';加入';或';离开';值,并对其进行排序?_Php_Mysql_Pdo - Fatal编程技术网

Php 如何使用';加入';或';离开';值,并对其进行排序?

Php 如何使用';加入';或';离开';值,并对其进行排序?,php,mysql,pdo,Php,Mysql,Pdo,我有一个表,可以跟踪游戏中玩家和每个服务器的加入和离开事件。我的问题是,我如何知道谁在离线,谁在在线 这就是我的表的结构,以及一些示例值: CREATE TABLE `b_rbx_connections` ( `id` int(11) NOT NULL, `server` varchar(48) NOT NULL, `place` int(11) NOT NULL, `player` int(11) NOT NULL, `type` enum('join','leave')

我有一个表,可以跟踪游戏中玩家和每个服务器的加入和离开事件。我的问题是,我如何知道谁在离线,谁在在线

这就是我的表的结构,以及一些示例值:

CREATE TABLE `b_rbx_connections` (
  `id` int(11) NOT NULL,
  `server` varchar(48) NOT NULL,
  `place` int(11) NOT NULL,
  `player` int(11) NOT NULL,
  `type` enum('join','leave') NOT NULL,
  `followed` int(11) DEFAULT NULL COMMENT '0/null=none',
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `b_rbx_connections` (`id`, `server`, `place`, `player`, `type`, `followed`, `time`) VALUES
(1, '83889ac4-eaf9-45af-8b9d-fa1b14dba952', 1253620452, 50180001, 'join', NULL, '2018-02-10 06:04:30'),
(2, '83889ac4-eaf9-45af-8b9d-fa1b14dba952', 1253620452, 50180001, 'leave', NULL, '2018-02-10 06:32:27'),
(3, '9f1aabe0-e314-46f1-bb81-c45ea70fdae9', 1253620452, 50180001, 'join', NULL, '2018-02-11 22:54:53');
每次玩家加入一行时,都会插入服务器id、地点id、是加入还是离开以及事件时间

这是我到目前为止尝试过的,但只有当每个玩家只加入/离开一次时,它才会起作用:

$q = "SELECT DISTINCT player FROM `b_rbx_connections` WHERE place='$placeId' AND type='join' AND time <= '$timestamp' ORDER BY `time` DESC";
$j = $db->query($q);
$q = "SELECT DISTINCT player FROM `b_rbx_connections` WHERE place='$placeId' AND type='leave' AND time <= '$timestamp' ORDER BY `time` DESC";
$l = $db->query($q);

$this->players = $j->fetchAll(PDO::FETCH_COLUMN, 0);
$this->offline_players = $l->fetchAll(PDO::FETCH_COLUMN, 0);
$this->online_players = array_diff($this->players, $this->offline_players);
但应该是这样

{
    "players": [
        "50180001"
    ],
    "offline_players": [

    ],
    "online_players": [
        "50180001"

    ]
}
注意:地点是游戏id,服务器是该游戏中服务器的实例id,玩家是该玩家的id

select p.player, (
    select c.type
    from b_rbx_connections c
    where c.player = p.player
      and c.place = 1253620452
    order by c.time desc
    limit 1
) as type
from b_rbx_players p
对于给定的
位置
,这将返回连接表中最后一行的所有播放机和
类型
。如果播放机没有条目,
类型
将为空(可以视为脱机)


现在使用PHP循环将玩家分配到不同的数组。

您应该在搜索中对玩家进行分组,以获得每个玩家的“最新”状态。然后使用新数组解析出所需的结果

SELECT  *
FROM (Select * FROM `b_rbx_connections` order by time desc) as results
GROUP BY player

我在这里添加了更多的播放器来测试查询。

您可以通过一个查询来实现这一点,并使用PHP解析数据。DISTINCT返回行的第一个实例,因此如果您按ID desc排序,那么您将获得该记录的最新状态。然后使用循环搜索结果集,并根据类型分成不同的数组。如果
播放机
拥有所有在线和离线播放机,您没有显示预期的输出。@MuhammadOmerAslam抱歉,播放机应该显示所有播放机,离线状态下的50180001应该在online@Juakali92该查询看起来如何?为您添加了一个答案,看看这是否对您有所帮助,您可以在
players
下获取所有在线或离线玩家,在
offline
下获取离线玩家,在
online
下获取在线玩家。它与您的“样本数据”一起工作。请在不起作用的地方发布示例数据。
SELECT  *
FROM (Select * FROM `b_rbx_connections` order by time desc) as results
GROUP BY player