• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何在MySQL表中创建一个新记录作为前一个只有diff变化的副本?

mysql 来源:Bing 7次浏览

我正在为将数据POST到我的服务器的第三方服务构建端点。为了减少带宽,第三方只发送来自前一记录的字段的更改。如何在MySQL表中创建一个新记录作为前一个只有diff变化的副本?

所以,想象一下表看起来像这样,与第一个记录:

+----+------+------+-------+-------+-------+ 
| id | item | size | color | state | count | 
+----+------+------+-------+-------+-------+ 
| 1 | 0001 | 500 | blue | on | 12 | 
+----+------+------+-------+-------+-------+ 

可能被发送到我的下一个数据将只是item: 0001, color: green, count: 15,我将不得不插入使表看起来记录像下面这样:

+----+------+------+-------+-------+-------+ 
| id | item | size | color | state | count | 
+----+------+------+-------+-------+-------+ 
| 1 | 0001 | 500 | blue | on | 12 | 
| 2 | 0001 | 500 | green | on | 15 | 
+----+------+------+-------+-------+-------+ 

通知的sizestate领域如何保持不变,但向下复制到下一行。 (id只是一个自动递增键)

此外,这是唯一的每item标识符。所以,如果我得到几个不同的item记录表看起来像这样:

+----+------+------+-------+-------+-------+ 
| id | item | size | color | state | count | 
+----+------+------+-------+-------+-------+ 
| 1 | 0001 | 500 | blue | on | 12 | 
| 2 | 0001 | 500 | green | on | 15 | 
| 3 | 0002 | 700 | white | off | 42 | 
| 4 | 0001 | 500 | red | off |  9 | 
| 5 | 0003 | 300 | black | on | 66 | 
+----+------+------+-------+-------+-------+ 

然后,我得到这个消息:item: 0002, size: 100表是这样的:

+----+------+------+-------+-------+-------+ 
| id | item | size | color | state | count | 
+----+------+------+-------+-------+-------+ 
| 1 | 0001 | 500 | blue | on | 12 | 
| 2 | 0001 | 500 | green | on | 15 | 
| 3 | 0002 | 700 | white | off | 42 | 
| 4 | 0001 | 500 | red | off |  9 | 
| 5 | 0003 | 300 | black | on | 66 | 
| 6 | 0002 | 100 | white | off | 42 | 
+----+------+------+-------+-------+-------+ 

有没有一种方法可以让我做这完全与MySQL?一个存储过程或类似的东西?

===========解决方案如下:

INSERT INTO ... SELECT可能会让你在这里相当远。请看下面的插入语句:

INSERT INTO yourTable (item, size, color, state, count) 
SELECT '0001', t1.size, 'green', t1.state, 15 
FROM yourTable t1 
INNER JOIN 
(
    SELECT item, MAX(id) AS max_id 
    FROM yourTable 
    GROUP BY item 
) t2 
    ON t1.item = t2.item AND 
     t1.id = t2.max_id 
WHERE t1.item = '0002'; 

我这里假设你的后端技术将接收其中要插入,用新的列值沿着item

注意,如果执行通过一份声明的上方,则该查询看起来更像是这样的:

INSERT INTO yourTable (item, size, color, state, count) 
SELECT ?, t1.size, ?, t1.state, ? 
FROM yourTable t1 
INNER JOIN 
(
    SELECT item, MAX(id) AS max_id 
    FROM yourTable 
    GROUP BY item 
) t2 
    ON t1.item = t2.item AND 
     t1.id = t2.max_id 
WHERE t1.item = ?; 

然后,您可以绑定值的占位符,即该查询可能被用来为每个刀片请求。

一个轻微的替代方案是在一个事务中只执行一个完整的select,然后是insert。但是,如果您可以在单个查询中执行此操作,则可能最好使用两个查询。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)