mysql - 表更新为相同值

标签 mysql database database-design

我正在使用的 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_intime_in 但在 date_outtime_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 |
+---------+------------+----------+------------+----------+

但是,从您的评论来看,实际过程是这样的:

  1. IN_Buffer数据插入stay
  2. 使用 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/

相关文章:

mysql - 自连接查询以获取一张表中的结果

java - 插入长文本时 Hibernate 不会保留

database - 如何有效地保存每个实体的用户状态?

database-design - 在微服务架构中拥有多个用户表

orm - DAL 和 ORM 之间的界线在哪里?

Mysql - 约会表的最佳主键

php - 跳过/绕过 A mysql_query 上的数据

php mysql 插入语句使用变量

database - 字符串如何在数据库中存储为字节?

android - Realm 以有效的方式删除孤立对象