2012-12-09 43 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

相关问题