我有一个包含会话ID,用户ID和最后活动字段的表。 每次用户访问网站时,会话ID都会插入到数据库中。
如果存在会话ID,但用户ID设置为0,则该用户被标记为访客。
如果存在会话ID,且用户ID字段不为0,则该用户被标记为已注册的在线用户
我的问题:
在线显示总用户数的最佳方式是什么,并将此信息拆分为多少来宾,以及注册了多少?这可以通过一个查询来完成吗?
示例:目前有 xxx 用户在线。 xxx 已注册, xxx 为来宾。
非常感谢,
FishSword
修改
我的会话MySQL表包含以下字段:
示例数据:
请参阅下面的示例数据。 sud,user,ip,updated
dasd645as46d5a46465,69,192.168.128.12,1315181134
示例1和3只应记录一次(作为一个在线访客),因为它们具有相同的用户ID,并且来自同一个计算机/ IP地址。
示例2和6应该只记录一次(作为一个在线成员),因为它们具有相同的用户ID,并且来自同一个计算机/ IP地址。
即使示例4和7来自不同的计算机,用户69也应该只记录一次(在线一个成员),因为它们具有相同的用户ID,并且来自同一台计算机/ ip地址
干杯! ;)
答案 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分钟内拥有在线用户数量。
这将降低整体性能(取决于请求和记录),因为每次用户发出请求时,您必须设置两个查询,一个用于插入/更新记录,另一个用于显示下面的统计信息。
您可以将两个查询合并为一个多查询以补偿一点。