0

我有一个设备系统,用户可以在其中选择一个设备并在他们的帐户中存储多达 10 个设备。任何时候都只能有一台设备处于活动状态。

我正在尝试提出正确的 MySQL 查询,以根据用户选择的设备插入/更新以下 userdevice 表;添加任何新设备(如果它尚未在他们的帐户中),并使其帐户上的任何其他设备处于非活动状态(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)

另一个问题是它允许两个设备处于活动状态。

我会很感激任何帮助。

4

1 回答 1

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)

单个活动记录:

确保单个活动记录的最佳建议是将其保存在单独的子记录表中。这可能需要您稍微更新一下您的表格。例如,您可能需要添加一个 ID 作为 PK,然后将 userid / deviceid 设置为 UNIQUE。

于 2013-01-17T03:34:30.523 回答