【问题标题】:Update with an incremented value based on corresponding row根据相应行使用增量值更新
【发布时间】:2010-10-16 20:37:11
【问题描述】:

这是你的 PHP 杂耍者的问题。 我想使用 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”字段的每个值(“

我尝试使用 COUNT(id) 进行查询以以某种方式递增。我尝试存储在数组中。我也想到了 mysql_data_seek() 。唉,我似乎没有成功。


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

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

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


任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: php mysql row auto-increment


    【解决方案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 个:分别提供 SETUPDATE 查询,或者忘记 SETting 任何事情,我只是讨厌未初始化的变量;)

    【讨论】:

    • 我会试试这个。似乎太复杂了,不容错过。 “分别提供 SET 和 UPDATE 查询”是什么意思?
    • 您不能将它们作为一个查询发送,而是作为 3 (mysql_query('SET...');mysql_query('SET...');mysql_query('UPDATE...');。它使用用户定义的变量,主要的复杂性来自与 SQL 的斗争:您不能 set 一个变量,除非它是某个表达式的一部分,因此简单的@counter := 1, @oldid := id 变成了具有相同结果的复杂表达式:@counter := (@oldid := id)/id,这可能导致浮点数,因此我们将其转换回整数。
    • 不错。你能否解释一下或发送一个链接,mysql变量@counter:直到查询结束、php脚本结束或重置mysql服务器会持续多久?我找不到它。
    • 直到连接结束,因此 SET 在开始(以防止先前的计数器可能弄脏东西),请参阅 dev.mysql.com/doc/refman/5.0/en/user-variables.html (注​​意:如果您使用持久连接,它们可以仍然是从以前的请求中设置的)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 类似于人工智能的把戏。不过,我需要一种方法来批量修改该表。实际上,我有大约 2300 行。
    • 2300条记录没问题。我将按照上面的建议创建另一个带有主键设置的空表(new_table),然后运行“INSERT INTO new_table (id) SELECT id FROM old_table” - 你就完成了。祝你好运:-)
    猜你喜欢
    • 2014-01-19
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多