谁是在线数据库

时间:2011-08-15 09:35:35

标签: php mysql

我有一个包含会话ID,用户ID和最后活动字段的表。 每次用户访问网站时,会话ID都会插入到数据库中。

如果存在会话ID,但用户ID设置为0,则该用户被标记为访客。

如果存在会话ID,且用户ID字段不为0,则该用户被标记为已注册的在线用户

我的问题:

在线显示总用户数的最佳方式是什么,并将此信息拆分为多少来宾,以及注册了多少?这可以通过一个查询来完成吗?

示例:目前有 xxx 用户在线。 xxx 已注册, xxx 为来宾。

非常感谢,

FishSword


修改

我的会话MySQL表包含以下字段:

  • sid - 存储会话ID。
  • user - 存储登录用户的用户ID。如果用户是访客,则存储0。
  • ip - 存储用户的IP地址。
  • updated - 存储用户上次活动时间的时间戳。

示例数据:

请参阅下面的示例数据。 sud,user,ip,updated

  • sd456asdfas65asf465,0,192.168.128.33,1315181434
  • v654xc654v65xc4v65z,24,192.168.128.65,1315181529
  • dfsddas654g4sa6g4s6,0,192.168.128.33,1315203155
  • y4g4df65gv4ff6sd54g,69,192.168.128.76,1315181134
  • c4cs546sd654sdf654df,42,192.168.128.85,1315181101
  • if465fsdf465sd46z65,24,192.168.128.65,1315203144
  • dasd645as46d5a46465,69,192.168.128.12,1315181134

    1. 示例1和3只应记录一次(作为一个在线访客),因为它们具有相同的用户ID,并且来自同一个计算机/ IP地址。

    2. 示例2和6应该只记录一次(作为一个在线成员),因为它们具有相同的用户ID,并且来自同一个计算机/ IP地址。

    3. 即使示例4和7来自不同的计算机,用户69也应该只记录一次(在线一个成员),因为它们具有相同的用户ID,并且来自同一台计算机/ ip地址

干杯! ;)

3 个答案:

答案 0 :(得分:2)

SELECT COUNT(*) AS online,IFNULL(SUM(user_id=0),0) AS guests,IFNULL(SUM(user_id>0),0) AS registered FROM (
    SELECT DISTINCT ip_address,user_id FROM sessions
) x

答案 1 :(得分:1)

制作表格

ID | SessID    | Guest
1  | someRand  | 1
2  | someRand2 | 0

然后选择

SELECT (SELECT COUNT(1) FROM sessions WHERE Guest = 1) as guests, (SELECT COUNT(1) FROM sessions WHERE Guest = 0) as users

并显示为

<?php
$result = mysql_query("SELECT (SELECT COUNT(1) FROM sessions WHERE Guest = 1) as guests, (SELECT COUNT(1) FROM sessions WHERE Guest = 0) as users");
$row = mysql_fetch_assoc($row);
echo "There are ".($row['users'] + $row['guests'])." users online, ".$row['users']." registered and ".$row['guests']." are guests";

答案 2 :(得分:1)

创建表(推荐)或在用户表中存储最后一个操作时间戳列。

user_id | action_timestamp    |
------------------------------
      1 | 2011-08-15 13:02:00 |
      2 | 2011-08-15 12:34:00 |
      3 | 2011-08-15 11:05:00 |

然后,为了使用最后一个在线用户,您可以进行以下选择:

SELECT COUNT(*) FROM table AS t WHERE TIMEDIFF(NOW(), action_timestamp) < '00:15:00' /* fifteen minutes */

现在,您在过去15分钟内拥有在线用户数量。

这将降低整体性能(取决于请求和记录),因为每次用户发出请求时,您必须设置两个查询,一个用于插入/更新记录,另一个用于显示下面的统计信息。

您可以将两个查询合并为一个多查询以补偿一点。