2012-12-09 44 views
2

一直在尋找這方面的例子,但顯然我不知道的術語不夠好,找到了答案:重複的記錄到同一個表的變化PHP的MySQL

利用PHP/MySQL的,我試圖複製在編輯數據的一部分時在表格中記錄。

有一個現有的表的「信息」,看起來像這樣:

1 ID - Int11 AutoIncrement 

2 elementID - Int11 Unique 

3 text - text utf8 

4 loopID - Int11 

5 created - datetime 

6 modified - datetime 

兩者「elementID」和「loopID」字段包含在其中的最後四位數字代表一個嵌入式標識符值,在這種情況下系統中的'頁面'。因此,例如:

頁 '9000' elementID的記錄爲

100019000 
100029000 
100039000 

和頁面 '9000' loopID的記錄爲

1009000 
1019000 
1029000 

頁 '9001' elementID的記錄被記錄爲

100019001 
100029001 
100039001 

和Page'9001'loopID的記錄被記錄爲

1009001 
1019001 
1029001 

希望你能明白。

我想要做的是創建一個新頁面(比如9002),最終用戶可以選擇從前一頁複製所有記錄數據(比如在這種情況下,他們想複製9001)。

在深入研究之前,我真的需要明白最好的方法是什麼。

起初我以爲我想要查詢所有匹配9001的記錄到一個數組中,用元素ID和循環中的所有最後4位9001替換爲9002,將「創建」和「修改」日期替換爲今天,然後將結果數組作爲新條目寫回數據庫中?如果是這樣,在替換髮生的時候,在查詢期間還是在回寫數據庫期間?

接着,當我開始還以爲這是導致我不知道這是否應該以這樣的方式來完成與此類似,而不是:

INSERT INTO information... 
SELECT REPLACE... 
FROM information 
[WHERE ..] 

我可以看到有涉及這一點,產生它足夠的元素對於像我這樣的數據庫業餘愛好者來說並不容易......如果有人能指點我一個這個過程的適當例子,那將是一個很大的幫助。

回答

0

東西沿着

declare newId int; 
declare copyFromId int; 
declare diff int; 

set newId := 9002; 
set copyFromId := 9001; 
setdiff := newId - copyFromId; -- in this case it will be 1 

select into your_table 
    select null, 
     elementID + diff, -- so for 100019000 it will be 100019001 
     text, 
     loopID + diff, -- same as above 
     now(), 
     now()   
    from your_table 
    where elementID mod 10000 = copyFromId; -- all lines with en elementId ending in copyFromId 
+0

嗨,非常感謝!託比可能是正確的,因爲我的經驗(或缺乏) - 但這看起來太酷了,不會嘗試......我遵循這裏的想法,雖然你比我的朋友聰明得多;-)不知道我明白'where elementID mod 10000'部分 - 我認爲國防部是爲了返回分部剩餘部分?所以我很難包裝我的頭怎麼會輸出...我會一直在想一些更像substr($ input,-4)...?無論如何,我一定會試一試並再次報告tx! – Soyo

+0

剩餘部分正是你想要的。看看這些例子http://sqlfiddle.com/#!2/c960a​​/39當divider是一個10,100,1000等等時,它只會剪掉上面的部分,類似於substring,但是數字。 –

0

線,我認爲你的第一個想法是一個一起去。

從數據庫中取出想要複製的所有記錄,然後在對數據庫執行更改之後在數據庫上執行查詢以將其添加回來。除非你需要做10,000個查詢,否則這個速度會非常快。

在SQL語句中這樣做會非常複雜且不必要。它可能作爲一個存儲過程,但最好的地方是在你的php

相關問題