2010-10-16 127 views
0

这是您的PHP玩杂耍的人的问题。 我想用普通的ol'mysql_ *函数的PHP。根据相应的行更新一个递增的值

我有以下MySQL表:

+-----+-----------------+ 
| id | thread   | 
+-----+-----------------+ 
| 14 | 01/    | 
| 14 | 02/    | 
| 14 | 03/    | 
| 15 | 01/    | 
| 22 | 01/    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 32 | XXX    | 
| 32 | XXX    | 
+-----+-----------------+ 

的 “XXX” 值是我的决策。我想该表更改(UPDATE)这一个:

+-----+-----------------+ 
| id | thread   | 
+-----+-----------------+ 
| 14 | 01/  <-  | 
| 14 | 02/    | 
| 14 | 03/    | 
| 15 | 01/  <-  | 
| 22 | 01/  <-  | 
| 24 | 01/  <-  | 
| 24 | 02/    | 
| 24 | 03/    | 
| 24 | 04/    | 
| 32 | 01/  <-  | 
| 32 | 02/    | 
+-----+-----------------+ 

在“ID”字段的每一个值(其中“< - ”是,我的决策,也有),“线程“字段值必须重置为”01 /“并继续递增,直到找到新的”id“值。

我试着用COUNT(id)查询以某种方式增加。我试图存储在数组中。我还想到了mysql_data_seek()。唉,我似乎没有把它关掉。


我得到了“线程”的格式正确,但:

$thread = $i < 10 ? "0$i" : $i; 

所以,如果它比10大,它没有得到一个前导零。但这只是有趣的一部分。


任何帮助,将不胜感激。

感谢

回答

1
SET @oldid = 0; 
SET @counter = 0; 
UPDATE tablename 
SET thread = CONCAT(
    LPAD(
    CAST(IF(id = @oldid, 
     @counter := @counter + 1,  -- same id, increment 
     @counter := (@oldid := id)/id) -- other id, set to 1 
     AS UNSIGNED), 
    2,'0'),       -- pad with '0' 
    '/')        -- append '/' 
WHERE thread = 'XXX'     -- or enumerate the whole thing if need be 
ORDER BY id, thread; 

哪些可以只被馈送到“纯醇”的mysql_query”(3连续:分别喂SET & UPDATE查询,或者忘掉SET婷什么,我只是不愿意未初始化的变量;)

+0

我会试试这个。似乎太复杂,错过。 “单独提供SET和UPDATE查询”是什么意思? – nevvermind 2010-10-16 22:48:41

+0

你不能发送它们作为一个查询,但作为3('mysql_query('SET ...'); mysql_query('SET ...'); mysql_query('UPDATE ...');'。它使用用户定义的变量,主要的复杂性来自于与SQL的对抗:除非它是表达式的一部分,否则不能“设置”变量,因此简单的'@counter:= 1,@oldid:= id'已经成为令人费解的表达式具有相同的结果:'@counter:=(@oldid:= id)/ id',这可能会导致一个浮点数,所以我们转回到整数。 – Wrikken 2010-10-16 23:15:37

+0

不错。你能解释或发送一个链接多久将忍受MySQL变量@counter:直到查询结束,php脚本或重置mysql服务器结束?我找不到它。 – 2010-10-17 18:59:46

0

设置主键的元组(ID,线程),并设置线程(而不是ID!)为AUTO_INCREMENT,然后 运行查询

INSERT INTO mytable (id) VALUES (24),(24),(32),(24),(32),(24) 

线程属性应该自动设置。如果你坚持“0n /”形式,我建议根据NEW.thread属性创建thread_string属性并创建BEFORE UPDATE触发器。 它工作吗?

+0

就像人工智能技巧。不过,我需要一种批量修改该表的方法。实际上,我有2300行。 – nevvermind 2010-10-16 22:45:24

+0

2300条记录没有问题。我将按照上面的建议创建另一个空主表(new_table),然后运行“INSERT INTO new_table(id)SELECT id FROM old_table” - 然后就完成了。祝你好运:-) – 2010-10-17 18:45:24