基于相应的行以递增的值更新

时间:2010-10-16 20:37:12

标签: php mysql row auto-increment

这里有一个PHP-juggler的问题。 我想使用PHP的普通“ mysql _ * 函数。

我有以下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”值是我的。我想将该表更改(更新)到这一个:

+-----+-----------------+
|  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”字段的每个 new 值上(其中“&lt; - ”是;我的制作,也是),“thread”字段值必须将自身重置为“01 / “并继续递增,直到找到”id“的新值。

我尝试用COUNT(id)查询以某种方式递增。我尝试在数组中存储。我还想到了mysql_data_seek()。唉,我似乎没有把它拉下来。


我得到了“线程”格式,但是:

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

因此,如果它大于10,则不会得到前导零。但这只是有趣的部分。


任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分: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;

可以将其添加到“plain ol'mysql_query”(连续3次:分别提供SET&amp; UPDATE个查询,或者忘记{{ 1}} ting任何东西,我只是讨厌未初始化的变量;)

答案 1 :(得分:0)

设置PRIMARY KEY元组(id,thread)并设置线程(但不是id!)作为AUTO_INCREMENT,然后 运行查询

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

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