2017-12-03 61 views
2

我正在爲將數據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?一個存儲過程或類似的東西?

回答

0

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

此刻,我的唯一標識符是'item'列,正如您在上面的示例中所見。我沒有爲之前的'item'記錄存儲'id'。我可以將它添加到'items'表(我確實有),但是不會因爲我需要查找該ID而失去將其作爲單個查詢的目的。 – Bing

+0

@Bing那麼你是否在尋找每件物品的最大ID記錄? –

+0

是的,用於更新每個唯一'item'標識符的最新記錄。 – Bing

相關問題