Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中为每个用户记录访问的日期时间和退出的日期时间_Mysql - Fatal编程技术网

在MySQL中为每个用户记录访问的日期时间和退出的日期时间

在MySQL中为每个用户记录访问的日期时间和退出的日期时间,mysql,Mysql,在mysql数据库的此表中,记录了每个用户的访问日期和时间以及退出日期和时间: +-----------+---------------------+-------+---------------------+------+ | tID | tDate | tUser | tDescription | tSet | +-----------+---------------------+-------+---------------------

在mysql数据库的此表中,记录了每个用户的访问日期和时间以及退出日期和时间:

+-----------+---------------------+-------+---------------------+------+
| 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的行