mysql - 使用可变数量的其他字段更新 mySQL 字段

标签 mysql sql-update parent-child concatenation

我有一个像这样设置的 mySQL 表

+----+----------+---------+
| id | parentid | content |
+----+----------+---------+
| 1  | 0        | a       |
| 2  | 1        | b       |
| 3  | 0        | c       |
| 4  | 3        | d       |
| 5  | 3        | e       |
| 6  | 3        | f       |
+----+----------+---------+

我想做的是将子项的内容连接到父项的末尾(然后删除子项,但我稍后会这样做),基于 id 的 ASC 顺序。所以结果应该是这样的(没有 child )

+----+----------+---------+
| id | parentid | content |
+----+----------+---------+
| 1  | 0        | ab      |
| 3  | 0        | cdef    |    
+----+----------+---------+

我遇到的问题是,如您所见, parent 可能有多个 child 。到目前为止,我的查询是

UPDATE table 
SET content = CONCAT(content, 
...
) ORDER BY id ASC

我不确定要在 ... 部分中放置什么以获取所有子项并按检索顺序追加它们。也许我的做法是错误的。任何帮助将不胜感激

最佳答案

一个选项是:

/*Table structure for table `table` */

DROP TABLE IF EXISTS `table`;

CREATE TABLE `table` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `parentid` INT(11) UNSIGNED NOT NULL,
  `content` VARCHAR(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB;

/*Data for the table `table` */

INSERT  INTO `table`(`parentid`,`content`)
VALUES
(0,'a'),(1,'b'),(0,'c'),(3,'d'),(3,'e'),(3,'f');

UPDATE `table`
    INNER JOIN
    (SELECT `t0`.`id`, CONCAT(`t0`.`content`, GROUP_CONCAT(`t1`.`content` SEPARATOR '')) AS `content`
     FROM `table` `t0`
        INNER JOIN `table` `t1` ON `t0`.`id` = `t1`.`parentid`
     WHERE `t0`.`parentid` = 0
     GROUP BY `t1`.`parentid`) `der`
SET `table`.`content` = `der`.`content`
WHERE `table`.`id` = `der`.`id`;

DELETE FROM `table` WHERE `parentid` > 0;

SQL Fiddle demo

关于mysql - 使用可变数量的其他字段更新 mySQL 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408992/

相关文章:

mysql - 从 MYSQL 例程结果中选择列

mysql - 静态Sql和动态Sql有什么区别?

Python:MySQLdb LOAD DATA INFILE 静默失败

python - 循环不适用于 sql 更新语句 (mysqldb)

asp.net-mvc - 在子级 `get` 操作后返回右父级的 `post`

mysql - SQL加入最后日期

mysql - 更新列文本

c# - 数据库未更新

c - 在子进程中调用 execlp() 后如何打印 f()?

javascript - jQuery 通过 ID 获取子值