【问题标题】:Update mySQL field with variable number of other fields使用可变数量的其他字段更新 mySQL 字段
【发布时间】:2013-12-05 19:37:07
【问题描述】:

我有一个这样设置的 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

我不确定在... 部分中放置什么来获取所有子级并附加它们以便检索它们。也许我走错了路。任何帮助将不胜感激

【问题讨论】:

    标签: mysql sql-update parent-child concat


    【解决方案1】:

    一个选项是:

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

    【讨论】:

    • 谢谢,这似乎可行,只是某些内容似乎被截断了。 group_concat 有效,但看起来可以连接的字符数受到限制......有什么想法吗?
    • nvm,刚刚找到这个,group_concat_max_len
    • 太棒了,在设置 group_concat_max_len = 10000000 并将 WHERE t0.parentid = 0 更改为 WHERE t1.parentid > 0 后,它工作得很好。我的例子与真正的数据库有点不同,所以这就是一个改变的目的。谢谢!
    【解决方案2】:

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

    将为您提供所需结果的查询是:

    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.

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      相关资源
      最近更新 更多