我正在使用的 MYSQL 数据库中有一个名为 TBL_stay 的表,旨在通过车牌记录车辆的进出时间。生成以下格式的表格:
ID| Plate | Date_in | Time_in | Date_out | Time_out
车辆从另一个表输入数据库,用作缓冲区。 入口日期正在顺利地传输到新表中,没有任何问题,因为正在使用简单的 INSERT 命令。然而,退出数据并没有按照我想要的方式更新。
我必须使用更新命令来确保数据不会粘贴到新行中,并且我使用的命令不是用最新的导出数据更新最新的入口数据,而是更新每个入口数据条目只有第一个结果。我不知道这是为什么。你能帮我吗?
这是退出数据的更新命令:
update tbl_stay
join tblout_buffer
on tblout_buffer.plate=tbl_stay.plate
set tbl_stay.date_out=tblout_buffer.Date_out, tbl_stay.time_out=tblout_buffer.time_out
where tbl_stay.date_in=tblout_buffer.date_out
这两个缓冲区具有相同的结构:Plate |日期输入/输出|时间入/出
以下是单个板的情况示例:
输入缓冲区:
HN51KTG | 2013-12-03 | 06-07-08
HN51KTG | 2013-12-03 | 07-08-09
HN51KTG | 2013-12-03 | 11-25-45
输出缓冲区:
HN51KTG | 2013-12-03 | 06-34-12
HN51KTG | 2013-12-03 | 10-29-40
HN51KTG | 2013-12-03 | 16-32-14
TBL_STAY:
1 |HN51KTG | 2013-12-03 | 06-07-08 | 2013-12-03 | 06-34-12
2 |HN51KTG | 2013-12-03 | 07-08-09 | 2013-12-03 | 06-34-12
3 |HN51KTG | 2013-12-03 | 11-25-45 | 2013-12-03 | 06-34-12
但我想要实现的是:
1 |HN51KTG | 2013-12-03 | 06-07-08 | 2013-12-03 | 06-34-12
2 |HN51KTG | 2013-12-03 | 07-08-09 | 2013-12-03 | 10-29-40
3 |HN51KTG | 2013-12-03 | 11-25-45 | 2013-12-03 | 16-32-14
<小时/>
更新
Strawberry 发布的解决方案是朝着正确方向迈出的一大步,但是,将数据放入表中的过程以及该表上的另一个事件查询会对该解决方案造成一些干扰:
当检测到车牌进入场所时,车牌、日期和时间将加载到 tblin_buffer
中。然后将其插入 Plate| 中Date_in|Time_in|
使用插入命令的 tbl_stay
中的列。
通过 VB.net GUI 每隔几秒运行一次查询,通过在 tbl_stay
中查找具有 date_in
和time_in
但在 date_out
和 time_out
中没有值
当检测到车牌离开场所时,车牌、日期和时间将加载到 tblout_buffer
中,然后将日期和时间传输到 |Date_out|Time_out|
tbl_stay
的 code> 列,带有 update
命令。
每次检测到板进入和退出时都会触发插入和更新命令,因此理想情况下,它们应该只关注各自表中的最新条目。
虽然我承认连接日期和时间可以简化程序,但我理想情况下希望保持当前列不变,因为这些是所有其他查询和命令中的引用。
下面是一些新的代码示例(如果有帮助的话):
原始插入命令:
insert into
tbl_stay (Plate,Date_in,Time_in)
select Plate,Date_in,Time_in
from tblin_buffer
where not exists
(select * from tbl_stay where
(tblin_buffer.Plate=tbl_stay.plate and tblin_buffer.Date_in=tbl_stay.Date_in and tblin_buffer.Time_in=tbl_stay.Time_in))
新的插入命令,改编自草莓的解决方案(目前似乎从缓冲区插入所有行。尝试使用上面的“where not办法存在子句,以及手动指定板值来弥补这一点):
insert into tbl_stay (Plate,date_in,time_in,rank_in)
SELECT a.plate, a.date_in, a.time_in,rank
FROM
( SELECT x.plate, x.date_in, x.time_in, COUNT(*) rank FROM tblin_buffer x
JOIN tblin_buffer y
ON y.plate = x.plate
AND ((y.date_in < x.date_in) OR (y.date_in = x.date_in AND y.time_in <= x.time_in))
GROUP BY x.plate, x.date_in, x.time_in) a
新的更新命令,也改编自草莓的解决方案:
update tbl_stay
JOIN
( SELECT x.plate
, x.date_out
, x.time_out
, COUNT(*) rank
FROM tblout_buffer x
JOIN tblout_buffer y
ON y.plate = x.plate
AND ((y.date_out < x.date_out) OR (y.date_out = x.date_out AND y.time_out <= x.time_out))
GROUP
BY x.plate
, x.date_out
, x.time_out
) b
ON b.plate = tbl_stay.plate
AND b.rank = tbl_stay.rank_in
set tbl_stay.date_out=b.date_out,
tbl_stay.time_out=b.time_out,
tbl_stay.rank_out=b.rank;
最佳答案
DROP TABLE IF EXISTS IN_Buffer;
CREATE TABLE IN_Buffer
(plate VARCHAR(12) NOT NULL
,date DATE NOT NULL,time TIME NOT NULL
,PRIMARY KEY(plate,date,time)
);
INSERT INTO IN_Buffer VALUES
('HN51KTG','2013-12-03','06:07:08'),
('HN51KTG','2013-12-03','07:08:09'),
('HN51KTG','2013-12-03','11:25:45');
DROP TABLE IF EXISTS OUT_Buffer;
CREATE TABLE OUT_Buffer
(plate VARCHAR(12) NOT NULL
,date DATE NOT NULL,time TIME NOT NULL
,PRIMARY KEY(plate,date,time)
);
INSERT INTO OUT_Buffer VALUES
('HN51KTG','2013-12-03','06:34:12'),
('HN51KTG','2013-12-03','10:29:40'),
('HN51KTG','2013-12-03','16:32:14');
SELECT a.plate
, a.date date_in
, a.time time_in
, b.date date_out
, b.time time_out
FROM
( SELECT x.plate
, x.date
, x.time
, COUNT(*) rank
FROM IN_buffer x
JOIN IN_buffer y
ON y.plate = x.plate
AND ((y.date < x.date) OR (y.date = x.date AND y.time <= x.time))
GROUP
BY x.plate
, x.date
, x.time
) a
JOIN
( SELECT x.plate
, x.date
, x.time
, COUNT(*) rank
FROM OUT_buffer x
JOIN OUT_buffer y
ON y.plate = x.plate
AND ((y.date < x.date) OR (y.date = x.date AND y.time <= x.time))
GROUP
BY x.plate
, x.date
, x.time
) b
ON b.plate = a.plate
AND b.rank = a.rank;
+---------+------------+----------+------------+----------+
| plate | date_in | time_in | date_out | time_out |
+---------+------------+----------+------------+----------+
| HN51KTG | 2013-12-03 | 06:07:08 | 2013-12-03 | 06:34:12 |
| HN51KTG | 2013-12-03 | 07:08:09 | 2013-12-03 | 10:29:40 |
| HN51KTG | 2013-12-03 | 11:25:45 | 2013-12-03 | 16:32:14 |
+---------+------------+----------+------------+----------+
但是,从您的评论来看,实际过程是这样的:
- 将
IN_Buffer
数据插入stay
- 使用 OUT_Buffer 数据更新
stay
。
这很容易。只需调整查询,如下所示。请注意,我已在 stay
表中连接了日期和时间...
CREATE TABLE stay
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,Plate VARCHAR(12) NOT NULL
, dt_in DATETIME NOT NULL
,dt_out DATETIME NULL);
INSERT INTO stay (plate,dt_in)
SELECT plate,CONCAT(date,' ',time) FROM IN_Buffer;
UPDATE stay m
JOIN
(
SELECT a.plate
, a.dt_in
, b.dt_out
FROM
( SELECT x.plate
, x.dt_in
, COUNT(*) rank
FROM stay x
JOIN stay y
ON y.plate = x.plate
AND y.dt_in <= x.dt_in
GROUP
BY x.plate
, x.dt_in
) a
JOIN
( SELECT x.plate
, CONCAT(x.date,' ',x.time) dt_out
, COUNT(*) rank
FROM OUT_buffer x
JOIN OUT_buffer y
ON y.plate = x.plate
AND ((y.date < x.date) OR (y.date = x.date AND y.time <= x.time))
GROUP
BY x.plate
, dt_out
) b
ON b.plate = a.plate
AND b.rank = a.rank
) n
ON n.plate = m.plate
AND n.dt_in = m.dt_in
SET m.dt_out = n.dt_out;
关于mysql - 表更新为相同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355427/