在MySQL中为每个用户记录访问的日期时间和退出的日期时间
在mysql数据库的此表中,记录了每个用户的访问日期和时间以及退出日期和时间:在MySQL中为每个用户记录访问的日期时间和退出的日期时间,mysql,Mysql,在mysql数据库的此表中,记录了每个用户的访问日期和时间以及退出日期和时间: +-----------+---------------------+-------+---------------------+------+ | tID | tDate | tUser | tDescription | tSet | +-----------+---------------------+-------+---------------------
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707951537 | 2020-02-11 11:17:13 | 13117 | STARTED ACCESS USER | NULL |
| 707757026 | 2020-02-11 11:16:05 | 43409 | STARTED ACCESS USER | NULL |
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | NULL |
| 707765775 | 2020-02-11 09:27:13 | 16920 | STARTED ACCESS USER | NULL |
| 707767122 | 2020-02-11 09:15:46 | 30303 | STARTED ACCESS USER | NULL |
| 707789986 | 2020-02-11 09:13:18 | 49798 | STARTED ACCESS USER | NULL |
| 707902406 | 2020-02-11 07:15:38 | 44333 | STARTED ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | NULL |
| 707918384 | 2020-02-11 07:03:30 | 43654 | STARTED ACCESS USER | NULL |
| 707951609 | 2020-02-11 06:56:41 | 22429 | STARTED ACCESS USER | NULL |
| 707965127 | 2020-02-11 06:08:16 | 41190 | STARTED ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
11 rows in set
当每个用户的日期时间输入和日期时间退出之间的差值小于三分钟时,我需要用值1更新tSet
列
在这种情况下,我需要此输出,因为对于用户16920
和43654
而言,日期时间输入和日期时间输出之间的差异小于三分钟:
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707951537 | 2020-02-11 11:17:13 | 13117 | STARTED ACCESS USER | NULL |
| 707757026 | 2020-02-11 11:16:05 | 43409 | STARTED ACCESS USER | NULL |
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | 1 |
| 707765775 | 2020-02-11 09:27:13 | 16920 | STARTED ACCESS USER | 1 |
| 707767122 | 2020-02-11 09:15:46 | 30303 | STARTED ACCESS USER | NULL |
| 707789986 | 2020-02-11 09:13:18 | 49798 | STARTED ACCESS USER | NULL |
| 707902406 | 2020-02-11 07:15:38 | 44333 | STARTED ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | 1 |
| 707918384 | 2020-02-11 07:03:30 | 43654 | STARTED ACCESS USER | 1 |
| 707951609 | 2020-02-11 06:56:41 | 22429 | STARTED ACCESS USER | NULL |
| 707965127 | 2020-02-11 06:08:16 | 41190 | STARTED ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
11 rows in set
我尝试了以下sql查询:
UPDATE `tTableUser` jjj
JOIN (
SELECT
a.tID,
a.tDate,
a.tUser,
a.tDescription,
TIMEDIFF(
SUBSTRING_INDEX(b.tDate, ' ' ,- 1),
SUBSTRING_INDEX(a.tDate, ' ' ,- 1)
) AS strDiff
FROM
`tTableUser` a
JOIN `tTableUser` b ON SUBSTRING_INDEX(a.tDate, ' ', 1) = SUBSTRING_INDEX(b.tDate, ' ', 1)
AND TRIM(a.tUser) = TRIM(b.tUser)
AND SUBSTRING_INDEX(a.tDate, ' ', 1) IN (
DATE_SUB(CURDATE(), INTERVAL 1 DAY)
)
AND SUBSTRING_INDEX(a.tDate, ' ' ,- 1) BETWEEN '06:00:00'
AND '12:00:00'
AND a.tDate > b.tDate
AND (
TIMEDIFF(
SUBSTRING_INDEX(a.tDate, ' ' ,- 1),
SUBSTRING_INDEX(b.tDate, ' ' ,- 1)
) BETWEEN '00:00:00'
AND '00:03:00'
)
ORDER BY
a.tDate DESC
) AS xsql
SET jjj.tSet = 1
WHERE
jjj.tID = xsql.tID;
SELECT * FROM `tTableUser`;
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707951537 | 2020-02-11 11:17:13 | 13117 | STARTED ACCESS USER | NULL |
| 707757026 | 2020-02-11 11:16:05 | 43409 | STARTED ACCESS USER | NULL |
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | 1 |
| 707765775 | 2020-02-11 09:27:13 | 16920 | STARTED ACCESS USER | NULL |
| 707767122 | 2020-02-11 09:15:46 | 30303 | STARTED ACCESS USER | NULL |
| 707789986 | 2020-02-11 09:13:18 | 49798 | STARTED ACCESS USER | NULL |
| 707902406 | 2020-02-11 07:15:38 | 44333 | STARTED ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | 1 |
| 707918384 | 2020-02-11 07:03:30 | 43654 | STARTED ACCESS USER | NULL |
| 707951609 | 2020-02-11 06:56:41 | 22429 | STARTED ACCESS USER | NULL |
| 707965127 | 2020-02-11 06:08:16 | 41190 | STARTED ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
11 rows in set
没有成功,因为输出是:
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707951537 | 2020-02-11 11:17:13 | 13117 | STARTED ACCESS USER | NULL |
| 707757026 | 2020-02-11 11:16:05 | 43409 | STARTED ACCESS USER | NULL |
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | 1 |
| 707765775 | 2020-02-11 09:27:13 | 16920 | STARTED ACCESS USER | NULL |
| 707767122 | 2020-02-11 09:15:46 | 30303 | STARTED ACCESS USER | NULL |
| 707789986 | 2020-02-11 09:13:18 | 49798 | STARTED ACCESS USER | NULL |
| 707902406 | 2020-02-11 07:15:38 | 44333 | STARTED ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | 1 |
| 707918384 | 2020-02-11 07:03:30 | 43654 | STARTED ACCESS USER | NULL |
| 707951609 | 2020-02-11 06:56:41 | 22429 | STARTED ACCESS USER | NULL |
| 707965127 | 2020-02-11 06:08:16 | 41190 | STARTED ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
11 rows in set
如何解决这个问题?
拜托,你能帮我吗
我的创建表代码如下:
DROP TABLE IF EXISTS `ttableuser`;
CREATE TABLE `ttableuser` (
`tID` int(11) NOT NULL,
`tDate` datetime DEFAULT NULL,
`tUser` int(11) DEFAULT NULL,
`tDescription` varchar(255) DEFAULT NULL,
`tSet` int(1) DEFAULT NULL,
PRIMARY KEY (`tID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records of ttableuser
-- ----------------------------
INSERT INTO `ttableuser` VALUES ('707951537', '2020-02-11 11:17:13', '13117', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707757026', '2020-02-11 11:16:05', '43409', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707765459', '2020-02-11 09:28:42', '16920', 'ENDING ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707765775', '2020-02-11 09:27:13', '16920', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707767122', '2020-02-11 09:15:46', '30303', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707789986', '2020-02-11 09:13:18', '49798', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707902406', '2020-02-11 07:15:38', '44333', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707917986', '2020-02-11 07:05:57', '43654', 'ENDING ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707918384', '2020-02-11 07:03:30', '43654', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707951609', '2020-02-11 06:56:41', '22429', 'STARTED ACCESS USER', null);
INSERT INTO `ttableuser` VALUES ('707965127', '2020-02-11 06:08:16', '41190', 'STARTED ACCESS USER', null);
考虑以下几点
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(
`tID` int(11) NOT NULL,
`tDate` datetime DEFAULT NULL,
`tUser` int(11) DEFAULT NULL,
`tDescription` varchar(255) DEFAULT NULL,
`tSet` int(1) DEFAULT NULL,
PRIMARY KEY (`tID`)
);
INSERT INTO my_table VALUES
('707757026', '2020-02-11 11:16:05', '43409', 'STARTED ACCESS USER', null),
('707765459', '2020-02-11 09:28:42', '16920', 'ENDING ACCESS USER', null),
('707765775', '2020-02-11 09:27:13', '16920', 'STARTED ACCESS USER', null),
('707767122', '2020-02-11 09:15:46', '30303', 'STARTED ACCESS USER', null),
('707789986', '2020-02-11 09:13:18', '49798', 'STARTED ACCESS USER', null),
('707902406', '2020-02-11 07:15:38', '44333', 'STARTED ACCESS USER', null),
('707917986', '2020-02-11 07:05:57', '43654', 'ENDING ACCESS USER', null),
('707918384', '2020-02-11 07:03:30', '43654', 'STARTED ACCESS USER', null),
('707951537', '2020-02-11 11:17:13', '13117', 'STARTED ACCESS USER', null),
('707951609', '2020-02-11 06:56:41', '22429', 'STARTED ACCESS USER', null),
('707965127', '2020-02-11 06:08:16', '41190', 'STARTED ACCESS USER', null);
假设每个用户只访问系统(最多)两次
…并根据需要添加一个按天过滤的条件
SELECT x.*
FROM my_table x
JOIN my_table y
ON y.tuser = x.tuser AND y.tid > x.tid
AND y.tdate < x.tdate + INTERVAL 3 MINUTE;
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
2 rows in set (0.04 sec)
选择x.*
从我的表x
加入我的桌子
在y.tuser=x.tuser和y.tid>x.tid上
y.tdate
根据您想要修改的行,上面的更新可能是
UPDATE my_table x
JOIN my_table y
ON y.tuser = x.tuser AND y.tid > x.tid
AND y.tdate < x.tdate + INTERVAL 3 MINUTE
SET y.tset = 1, x.tset = 1;
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4 Changed: 4 Warnings: 0
SELECT * FROm my_table;
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707757026 | 2020-02-11 11:16:05 | 43409 | STARTED ACCESS USER | NULL |
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | 1 |
| 707765775 | 2020-02-11 09:27:13 | 16920 | STARTED ACCESS USER | 1 |
| 707767122 | 2020-02-11 09:15:46 | 30303 | STARTED ACCESS USER | NULL |
| 707789986 | 2020-02-11 09:13:18 | 49798 | STARTED ACCESS USER | NULL |
| 707902406 | 2020-02-11 07:15:38 | 44333 | STARTED ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | 1 |
| 707918384 | 2020-02-11 07:03:30 | 43654 | STARTED ACCESS USER | 1 |
| 707951537 | 2020-02-11 11:17:13 | 13117 | STARTED ACCESS USER | NULL |
| 707951609 | 2020-02-11 06:56:41 | 22429 | STARTED ACCESS USER | NULL |
| 707965127 | 2020-02-11 06:08:16 | 41190 | STARTED ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
更新我的表格x
加入我的桌子
在y.tuser=x.tuser和y.tid>x.tid上
y.tdate
考虑以下几点
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(
`tID` int(11) NOT NULL,
`tDate` datetime DEFAULT NULL,
`tUser` int(11) DEFAULT NULL,
`tDescription` varchar(255) DEFAULT NULL,
`tSet` int(1) DEFAULT NULL,
PRIMARY KEY (`tID`)
);
INSERT INTO my_table VALUES
('707757026', '2020-02-11 11:16:05', '43409', 'STARTED ACCESS USER', null),
('707765459', '2020-02-11 09:28:42', '16920', 'ENDING ACCESS USER', null),
('707765775', '2020-02-11 09:27:13', '16920', 'STARTED ACCESS USER', null),
('707767122', '2020-02-11 09:15:46', '30303', 'STARTED ACCESS USER', null),
('707789986', '2020-02-11 09:13:18', '49798', 'STARTED ACCESS USER', null),
('707902406', '2020-02-11 07:15:38', '44333', 'STARTED ACCESS USER', null),
('707917986', '2020-02-11 07:05:57', '43654', 'ENDING ACCESS USER', null),
('707918384', '2020-02-11 07:03:30', '43654', 'STARTED ACCESS USER', null),
('707951537', '2020-02-11 11:17:13', '13117', 'STARTED ACCESS USER', null),
('707951609', '2020-02-11 06:56:41', '22429', 'STARTED ACCESS USER', null),
('707965127', '2020-02-11 06:08:16', '41190', 'STARTED ACCESS USER', null);
假设每个用户只访问系统(最多)两次
…并根据需要添加一个按天过滤的条件
SELECT x.*
FROM my_table x
JOIN my_table y
ON y.tuser = x.tuser AND y.tid > x.tid
AND y.tdate < x.tdate + INTERVAL 3 MINUTE;
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
2 rows in set (0.04 sec)
选择x.*
从我的表x
加入我的桌子
在y.tuser=x.tuser和y.tid>x.tid上
y.tdate
根据您想要修改的行,上面的更新可能是
UPDATE my_table x
JOIN my_table y
ON y.tuser = x.tuser AND y.tid > x.tid
AND y.tdate < x.tdate + INTERVAL 3 MINUTE
SET y.tset = 1, x.tset = 1;
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4 Changed: 4 Warnings: 0
SELECT * FROm my_table;
+-----------+---------------------+-------+---------------------+------+
| tID | tDate | tUser | tDescription | tSet |
+-----------+---------------------+-------+---------------------+------+
| 707757026 | 2020-02-11 11:16:05 | 43409 | STARTED ACCESS USER | NULL |
| 707765459 | 2020-02-11 09:28:42 | 16920 | ENDING ACCESS USER | 1 |
| 707765775 | 2020-02-11 09:27:13 | 16920 | STARTED ACCESS USER | 1 |
| 707767122 | 2020-02-11 09:15:46 | 30303 | STARTED ACCESS USER | NULL |
| 707789986 | 2020-02-11 09:13:18 | 49798 | STARTED ACCESS USER | NULL |
| 707902406 | 2020-02-11 07:15:38 | 44333 | STARTED ACCESS USER | NULL |
| 707917986 | 2020-02-11 07:05:57 | 43654 | ENDING ACCESS USER | 1 |
| 707918384 | 2020-02-11 07:03:30 | 43654 | STARTED ACCESS USER | 1 |
| 707951537 | 2020-02-11 11:17:13 | 13117 | STARTED ACCESS USER | NULL |
| 707951609 | 2020-02-11 06:56:41 | 22429 | STARTED ACCESS USER | NULL |
| 707965127 | 2020-02-11 06:08:16 | 41190 | STARTED ACCESS USER | NULL |
+-----------+---------------------+-------+---------------------+------+
更新我的表格x
加入我的桌子
在y.tuser=x.tuser和y.tid>x.tid上
y.tdate
每个用户最多只记录两次?他们一次进入,一次离开?@草莓每位用户每次进入和退出当前日期时都会被记录“一天”是否在午夜后开始,并在同一天的午夜前结束?@草莓是的,先生!每个用户只记录(最多)两次?他们一次进入,一次离开?@草莓每位用户每次进入和退出当前日期时都会被记录“一天”是否在午夜后开始,并在同一天的午夜前结束?@草莓是的,先生!谢谢,但是更新my_Table
时的输出没有改变好的,但是我需要将tSet
列的值设置为1,也用于tID
707765459和707917986的行