Mysql 如果A列和B列之间的值不同,如何删除值
我遇到了一些问题,当我想进行一些验证时,查询没有显示我的期望表,所以我想进行一些值,但是如果字段Mysql 如果A列和B列之间的值不同,如何删除值,mysql,Mysql,我遇到了一些问题,当我想进行一些验证时,查询没有显示我的期望表,所以我想进行一些值,但是如果字段A和B中的值不同,那么与字段B相关的表的值将是NULL 我的期望表如下: +-----------+---------------------+-------------+-------------+---------------------------+ + no_reg + date_time_A + time_in + time_out + B.date_t
A
和B
中的值不同,那么与字段B
相关的表的值将是NULL
我的期望表如下:
+-----------+---------------------+-------------+-------------+---------------------------+
+ no_reg + date_time_A + time_in + time_out + B.date_time date_time_B +
+-----------+---------------------+-------------+-------------+---------------------------+
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 21:15:00 + 2020-05-04 21:15:00 +
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 28:15:00 + 2020-05-04 28:15:00 +
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 27:15:00 + 2020-05-04 27:15:00 +
+ 2019069 + 2020-05-05 07:15:00 + 07:15:00 + 21:15:00 + 2020-05-05 21:15:00 +
+ 2019069 + 2020-05-06 07:15:00 + 07:15:00 + NULL + NULL +
+ 2019069 + NULL + NULL + 23:15:00 + 2020-05-07 23:15:00 +
+-----------+---------------------+-------------+-------------+---------------------------+
但实际上,代码结果是:
+-----------+---------------------+-------------+-------------+---------------------------+
+ no_reg + date_time_A + time_in + time_out + B.date_time date_time_B +
+-----------+---------------------+-------------+-------------+---------------------------+
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 21:15:00 + 2020-05-04 21:15:00 +
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 28:15:00 + 2020-05-04 28:15:00 +
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 27:15:00 + 2020-05-04 27:15:00 +
+ 2019069 + 2020-05-05 07:15:00 + 07:15:00 + 21:15:00 + 2020-05-05 21:15:00 +
+ 2019069 + 2020-05-05 07:15:00 + 07:15:00 + 23:15:00 + 2020-05-07 23:15:00 +
+ 2019069 + 2020-05-06 07:15:00 + 07:15:00 + 23:15:00 + 2020-05-07 23:15:00 +
+-----------+---------------------+-------------+-------------+---------------------------+
SELECT A.id, A.no_reg, A.date_time date_time_A, A.time time_in,
CASE
WHEN B.time BETWEEN '12:00:00' AND '23:59:00' THEN B.time
WHEN B.time BETWEEN '00:00:00' AND '06:14:00' THEN TIMEDIFF(B.time, "-24:00:00")
END time_out, B.time test, B.date_time date_time_B
FROM raw_attendance A
LEFT JOIN raw_attendance B
ON A.no_reg = B.no_reg
AND A.date_time < B.date_time
WHERE A.time BETWEEN '06:14:00' AND '11:59:00' AND A.`no_reg` = '2019069'
HAVING
CASE
WHEN B.time BETWEEN '00:00:00' AND '06:14:00' OR B.time BETWEEN '12:00:00' AND '23:59:00' THEN 1
WHEN A.date_time <> B.date_time THEN 0 ELSE 1
END
ORDER BY A.`date_time` ASC
对于数据库结构:
CREATE TABLE `raw_attendance` (
`id` int(11) NOT NULL,
`no_reg` varchar(128) NOT NULL,
`date_time` datetime NOT NULL,
`time` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `raw_attendance` (`id`, `no_reg`, `date_time`, `time`) VALUES
(115, '2019069', '2020-05-04 07:15:00', '07:15:00'),
(116, '2019069', '2020-05-04 21:15:00', '21:15:00'),
(117, '2019069', '2020-05-05 03:15:00', '03:15:00'),
(118, '2019069', '2020-05-05 04:15:00', '04:15:00'),
(119, '2019069', '2020-05-05 07:15:00', '07:15:00'),
(120, '2019069', '2020-05-05 21:15:00', '21:15:00'),
(121, '2019069', '2020-05-06 07:15:00', '07:15:00'),
(123, '2019069', '2020-05-07 23:15:00', '23:15:00'),
(124, '2019070', '2020-05-04 07:25:00', '07:25:00'),
(125, '2019070', '2020-05-04 21:25:00', '21:25:00'),
(126, '2019070', '2020-05-05 03:35:00', '03:35:00'),
(127, '2019070', '2020-05-05 04:25:00', '04:25:00'),
(128, '2019070', '2020-05-05 07:55:00', '07:55:00'),
(129, '2019070', '2020-05-05 21:55:00', '21:55:00');
我用于reality结果的查询是:
+-----------+---------------------+-------------+-------------+---------------------------+
+ no_reg + date_time_A + time_in + time_out + B.date_time date_time_B +
+-----------+---------------------+-------------+-------------+---------------------------+
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 21:15:00 + 2020-05-04 21:15:00 +
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 28:15:00 + 2020-05-04 28:15:00 +
+ 2019069 + 2020-05-04 07:15:00 + 07:15:00 + 27:15:00 + 2020-05-04 27:15:00 +
+ 2019069 + 2020-05-05 07:15:00 + 07:15:00 + 21:15:00 + 2020-05-05 21:15:00 +
+ 2019069 + 2020-05-05 07:15:00 + 07:15:00 + 23:15:00 + 2020-05-07 23:15:00 +
+ 2019069 + 2020-05-06 07:15:00 + 07:15:00 + 23:15:00 + 2020-05-07 23:15:00 +
+-----------+---------------------+-------------+-------------+---------------------------+
SELECT A.id, A.no_reg, A.date_time date_time_A, A.time time_in,
CASE
WHEN B.time BETWEEN '12:00:00' AND '23:59:00' THEN B.time
WHEN B.time BETWEEN '00:00:00' AND '06:14:00' THEN TIMEDIFF(B.time, "-24:00:00")
END time_out, B.time test, B.date_time date_time_B
FROM raw_attendance A
LEFT JOIN raw_attendance B
ON A.no_reg = B.no_reg
AND A.date_time < B.date_time
WHERE A.time BETWEEN '06:14:00' AND '11:59:00' AND A.`no_reg` = '2019069'
HAVING
CASE
WHEN B.time BETWEEN '00:00:00' AND '06:14:00' OR B.time BETWEEN '12:00:00' AND '23:59:00' THEN 1
WHEN A.date_time <> B.date_time THEN 0 ELSE 1
END
ORDER BY A.`date_time` ASC
选择A.id、A.no\u reg、A.date\u time date\u time\u A、A.time time\u in、,
案例
当B.时间介于'12:00:00'和'23:59:00'之间时,则B.时间
当B.时间介于'00:00:00'和'06:14:00'之间时,则TIMEDIFF(B.时间,“-24:00:00”)
结束超时,B.时间测试,B.日期时间日期时间
从原始出席A
左加入原始出席B
在A.no_reg=B.no_reg上
A.日期时间
对于测试编辑器:
如果我的解释无法理解,我向您道歉,您可以再问我一次,谢谢您注意,除了与一组子句一起使用之外,使用have是非常罕见的,这是一个好的查询吗?如果没有,我将再次更改以获得更好的结果您的代码建议您有时间范围来决定时间进入和退出,但为什么(117,'2019069',2020-05-05 03:15:00',03:15:00')和(118,'2019069',2020-05-05 04:15:00',04:15:00')不出现在您的异常中,此外,您似乎建议成对的行表示时间进入/超时,除非第二行在同一天或第二天00:06:14之前没有超时值?时间范围我拥有的是
time\u in
have range'06:15:00'-'11:59:00'
,然后对于time\u out
have range'12:00:00'-'23:59:00'
(同一天)和第二个范围'00:00:00'-'06:14:00'
(另一天),但如果我有日期(117,'2019069','2020-05-05 03:15:00','03:15:00')和(118,'2019069','2020-05-05 04:15:00','04:15:00')之类的条件
该值将在'2020-05-04'
中的时间
字段中进行组合,该字段在'2020-05-04'
中有一个日期
,并且当超时
在'00:00:00'和'06:14:00'之间时,我也有条件
将使用时间差(“-24:00:00”)
加上时间,以便于比较时间