- 论坛徽章:
- 0
|
CREATE TABLE `limitime` (
`UserName` varchar(64) NOT NULL,
`maxtime` int(11) NOT NULL,
PRIMARY KEY (`UserName`)
) ENGINE=MyISAM;
CREATE TABLE `radacct` (
`UserName` varchar(64) NOT NULL DEFAULT '',
`AcctSessionTime` int(12) DEFAULT NULL,
PRIMARY KEY (`UserName`),
) ENGINE=MyISAM;
CREATE TABLE `radcheck` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`UserName` varchar(64) NOT NULL DEFAULT '',
`Attribute` varchar(32) NOT NULL DEFAULT '',
`op` char(2) NOT NULL DEFAULT '==',
`Value` varchar(253) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `UserName` (`UserName`(32))
) ENGINE=MyISAM;
这样一个数据库其中表limitime用来存储用户可以使用的总的时间限制,如果是这个用户包月的话这个表中就没有这个用户的信息;radacct是用户每次使用了的时间;radcheck是用户的信息,Value这个字段存储用户每次可以在线的时间限制,是可以为空的。服务器不会判断用户总的时间,只会判断radcheck表中的值来设置用户每次在线时间,为0时不允许登陆,包月用户没有值。每次用户下线时都会发送一条更新语句到radacct这个表,现在想也让同时更新radcheck表,重新设置用户的每次在线时间,这样就可以限制用户问的上线时间了,但应用程序只可以接受一条SQL语句,本来可以用UPDATE radacct,radcheck set radacct.AcctSessionTime=当次在线时间 radcheck.Value=(SELECT limitime.maxtime - SUM(radacct.AcctSessionTime) FROM limitime,radacct WHERE limitime.UserName=radacct.UserName AND radacct.UserName=当前用户) WHERE radacct.UserName=radcheck.UserName AND radcheck.UserName=当前用户;这样来更新,但问题是现在有包月用户,他在limitime这个表中是没有记录的,用这条语句肯定会出错的。现在只用一条语句怎么来实现呢?
[ 本帖最后由 不用马甲 于 2007-4-11 22:12 编辑 ] |
|