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

时间:2013-12-05 19:37:07

标签: mysql sql-update parent-child concat

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

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

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

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

我遇到的问题是,你可以看到父母可能有多个孩子。到目前为止我的查询是

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

我不知道在...部分放置什么来抓住所有孩子并按照它们被检索的顺序追加它们。也许我正在以错误的方式去做。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

你必须对表进行如此多的更改,以便用新数据创建另一个并删除当前数据可能会更好。

可以获得您正在寻找的结果的查询是:

SELECT
  min(t1.id) id,
  0 parentid,
  group_concat(t1.content ORDER BY t1.id separator '') content
FROM t t1
LEFT JOIN t t2 ON t1.parentid = t2.id
GROUP BY coalesce(t2.id, t1.id);

小提琴here

答案 1 :(得分:0)

一个选项是:

/*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