我有一个设备系统,用户可以在其中选择设备并在其帐户中存储最多10台设备。任何时候只能有一个设备处于活动状态。
我正在尝试根据用户选择的设备提出正确的MySQL查询来插入/更新以下用户设备表;添加任何新设备(已激活),如果它们尚未在其帐户中,并使其帐户上的任何其他设备处于非活动状态(0)。
$ userId,$ newDeviceId和$ oldActiveDeviceId可用于构造查询。
CREATE TABLE IF NOT EXISTS `userdevice` (
`userid` int(11) NOT NULL,
`deviceid` int(11) NOT NULL,
`dateadded` datetime NOT NULL,
`datelastactive` datetime NOT NULL,
`active` tinyint(4) NOT NULL,
PRIMARY KEY (`userid`,`deviceid`),
KEY `active` (`active`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
一些示例数据:
INSERT INTO `userdevice` (`userid`, `deviceid`, `dateadded`, `datelastactive`, `active`) VALUES
(1, 1294, '2013-01-17 02:46:09', '2013-01-17 02:48:00', 1),
(1, 1307, '2013-01-17 02:45:24', '2013-01-17 02:45:00', 0),
(1, 1760, '2013-01-17 02:40:45', '2013-01-17 02:42:00', 0);
我想出了以下查询,但当然在更新oldActiveDeviceId时会重置'datelastactive'字段:
INSERT INTO userdevice
(userid, deviceid, dateadded, datelastactive, active
VALUES
($userId,$newestDeviceId,NOW(),NOW(),1),
($userId,$oldActiveDeviceId,'','',0)
ON DUPLICATE KEY
UPDATE datelastactive = VALUES(datelastactive), active = VALUES(active)
另一个问题是它允许两个设备处于活动状态。
我很感激任何帮助。
答案 0 :(得分:0)
要修复datelastactive,请将datelastactive更改为NOW()。
INSERT INTO userdevice
(userid, deviceid, dateadded, datelastactive, active
VALUES
($userId,$newestDeviceId,NOW(),NOW(),1),
($userId,$oldActiveDeviceId,'','',0)
ON DUPLICATE KEY UPDATE datelastactive = NOW(), active = VALUES(active)
单一活动记录:
确保单个活动记录的最佳建议是将其保留在单独的child record table中。这可能需要您稍微更新您的表。例如,您可能需要添加一个ID作为PK,然后将userid / deviceid设置为UNIQUE。