php - 在表中沿链向下移动值

标签 php mysql

前提是我从mysql数据库表中得到如下结果集:

+----+------+-------+
| ID | type | value |
+----+------+-------+
|  8 |    A |  1435 |
|  9 |    B |  7348 | 
| 10 |    A |  1347 | 
| 11 |    A |  3478 | 
| 12 |    A |  4589 | 
| 13 |    B |  6789 |
+----+------+-------+

我想删除行 ID 8 并将字段“值”中的值下推,这样每一行都具有前一个条目的值,但仅影响字段“类型”相同的那些作为被删除的行(在本例中为“A”)。

也就是说,删除行 id 8 最终会产生以下结果:

+----+------+-------+
| ID | type | value |
+----+------+-------+
|  - |    - |    -  | *
|  9 |    B |  7348 |   |
| 10 |    A |  1435 | * |
| 11 |    A |  1347 | * |
| 12 |    A |  3478 | * |
| 13 |    B |  6789 |   V
+----+------+-------+

ID 10 继承了 ID 8 的值,然后 ID 11 继承了 ID 10,依此类推。但是请注意类型为“B”的行如何不受影响。

所以问题是:有没有什么方法可以执行这种值的“转换”,而不必逐行查询和更新每一行?在理想情况下,我会执行一个查询来执行移位,然后执行另一个查询来删除该行,但我不太确定这是否可能。

(另外我宁愿不使用触发器,因为我打算将所有应用程序逻辑封装在应用程序本身中)

最佳答案

SET @remove_id = 8;

SELECT ID, type, value FROM (
  SELECT   ID,
           type,
           CAST(IF(type <> @type OR ISNULL(@val), value, @val) AS UNSIGNED)
             AS value,
           @type := IF(ID   = @remove_id, type, @type),
           @val  := IF(type = @type, value, @val)
  FROM     my_table JOIN (SELECT @type := NULL, @val := NULL) AS z
  ORDER BY ID ASC
) AS t
WHERE ID <> @remove_id

查看 sqlfiddle .


更新

我没有意识到您实际上想要更新基础表。为此,您可以使用一些小技巧在 UPDATE 语句中有效地做同样的事情(不能直接分配给用户变量,而是将其新值和从新分配的用户变量的前 0 个字符形成的空字符串):

SET @remove_id = 8, @type = NULL, @val = NULL;

UPDATE my_table SET
  value = IF(
    type <> @type OR ISNULL(@val),
    value,
    CONCAT(@val, LEFT(@val := value, 0))
  ),
  type = CONCAT(type, LEFT(
    @type := IF(
      ID <> @remove_id,
      @type,
      CONCAT(type, LEFT(@val := value, 0))
    )
  , 0))
ORDER BY ID ASC;

DELETE FROM my_table WHERE ID = @remove_id;

查看 sqlfiddle .

关于php - 在表中沿链向下移动值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10833677/

相关文章:

php - Laravel 5 重定向消息

php - Symfony2 翻译验证消息问题

mysql - 如何从并发表读取中的范围选择中获取唯一主键

mysql - 按 ID 移位更新表

mysql - 使用Entityframework从Mvc应用程序连接到Mysql

mysql - 比较 MySQL 字符串并获取允许的值

javascript - PHP 无法接收来自 JavaScript 的帖子

php - 使用 .htaccess 更改 URL .php 扩展名

php - fatal error : Uncaught exception 'Exception' with message 'String could not be parsed as XML'

mysql - 如何使用 Apache Drill 同时处理 Excel 文档和 RDBMS 中的源?