Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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_Database_Database Design - Fatal编程技术网

Mysql 使用相同值更新表

Mysql 使用相同值更新表,mysql,database,database-design,Mysql,Database,Database Design,我正在使用的MYSQL数据库中有一个名为TBL_stay的表,用于通过车牌获取车辆的进出时间。生成以下格式的表格: ID| Plate | Date_in | Time_in | Date_out | Time_out 车辆从另一个表输入数据库,用作缓冲区。 因为使用了一个简单的INSERT命令,所以入口日期被传输到新表中,没有问题。然而,退出数据并没有按照我所希望的方式更新 我必须使用update命令来确保数据不会粘贴到新行,我使用的命令不是用最新的出口数据更新最新的入口数据,而是用第一个结

我正在使用的MYSQL数据库中有一个名为TBL_stay的表,用于通过车牌获取车辆的进出时间。生成以下格式的表格:

ID| Plate | Date_in | Time_in | Date_out | Time_out
车辆从另一个表输入数据库,用作缓冲区。 因为使用了一个简单的INSERT命令,所以入口日期被传输到新表中,没有问题。然而,退出数据并没有按照我所希望的方式更新

我必须使用update命令来确保数据不会粘贴到新行,我使用的命令不是用最新的出口数据更新最新的入口数据,而是用第一个结果更新每个入口数据条目。我不知道这是为什么。你能帮我吗

以下是退出数据的更新命令:

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
两个缓冲器都具有相同的结构:板|日期输入/输出|时间输入/输出

以下是一个单板的情况示例:

缓冲区中:

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
待会见:

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
使现代化 草莓发布的解决方案是朝着正确方向迈出的一大步,但是,将数据放入表的过程以及此表上的另一个活动查询会对此解决方案造成一些干扰:

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;
当检测到一个车牌进入房屋时,车牌、日期和时间将加载到tblin_缓冲区。然后通过insert命令将其插入到tbl|U STAIL中的板| Date|U in | Time|U in |列中

通过VB.net GUI每隔几秒钟运行一次查询,通过在tbl_stay中查找包含日期和时间但不包含日期和时间值的条目,生成现场车辆表

当检测到一个车牌离开该场所时,车牌、日期和时间将加载到tblout|U缓冲区中,然后传输到tbl|U的|日期|时间|列中的日期和时间将保留更新命令

每次检测到板进入和退出时,insert和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))
新的insert命令(改编自草莓的解决方案)目前似乎可以插入缓冲区中的所有行。试图用上面的where not exists子句对此进行补偿,并手动指定板值:

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;

无法使用以下连接条件将表1中的第一条记录与表2中的第一条记录进行匹配:tblout_buffer.plate=tbl_stay.plate。您必须使用额外的唯一字段扩展tblout_缓冲区表,该字段将包含记录编号1、2、3等,并在联接条件中使用此字段。表tbl_stay也必须具有唯一标识符才能执行这样的更新。我假设表结构已经有一些唯一标识符-ID列。谢谢。这是朝着正确方向迈出的一大步。我仍然需要将输入和输出内容分别插入tbl_。我注意到,在这里调整您的解决方案时,缓冲区的全部内容都被转移,导致tbl_中的重复数据被保留。你对此有什么建议吗?为什么“单独”呢?此外,虽然我知道您可能无法对缓冲区数据的格式做太多的调整,但调整停留表,使日期和时间存储为一体,将极大地提高性能和易用性。Tbl_停留还用于现场车辆查询,它查找表中具有IN time但没有OUT time的条目。当车辆进入时,通过insert命令将其进入时间添加到表的一半,当车辆退出时,通过update命令将退出时间添加到表的另一半,以生成初始问题中提到的数据格式,然后查询该数据以生成关于停留时间等的报告。哦,好吧,但这不是问题,是吗?嗯,目前,这就是我的问题所在。我正在尝试调整您提供的解决方案,以适应此场景,这正是我现在正在努力解决的问题。如果有帮助,我会根据新情况更新我的问题
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;