【问题标题】:MySql: Update table with minimum of subset of tableMySql:用最小的表子集更新表
【发布时间】:2014-08-28 17:25:24
【问题描述】:

这是我的测试数据库:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    PRIMARY KEY (`id`),
    `parent` int(10) unsigned DEFAULT NULL, 
    `number` int DEFAULT NULL
) ENGINE=InnoDB;

INSERT INTO t1 SET id=1, parent=NULL, number=NULL;
INSERT INTO t1 SET id=2, parent=NULL, number=NULL;
INSERT INTO t1 SET id=3, parent=NULL, number=NULL;

INSERT INTO t1 SET parent=1, number=4;
INSERT INTO t1 SET parent=1, number=2;
INSERT INTO t1 SET parent=1, number=3;

INSERT INTO t1 SET parent=2, number=10;
INSERT INTO t1 SET parent=2, number=20;
INSERT INTO t1 SET parent=2, number=30;

INSERT INTO t1 SET parent=3, number=3;
INSERT INTO t1 SET parent=3, number=2;
INSERT INTO t1 SET parent=3, number=1;

我正在尝试将每个父级的“数量”设置为其子级“数量”的最小值:

UPDATE t1 
SET number=(SELECT min(number) FROM t1 AS t2 WHERE t1.id=t2.parent) 
WHERE t1.parent IS NULL;

但这给了我一个错误: ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM 子句

我知道这种方式是 JOIN,但我不明白:

UPDATE t1 
LEFT JOIN
    (SELECT min(t2.number) AS minnumber, t2.parent AS parent FROM t1 AS t2) t2
ON t1.id = t2.parent
SET t1.number = t2.minnumber
WHERE t1.parent IS NULL;

但 id1、id2、id3 的“数字”在那之后只是 NULL。我认为那是因为在 JOIN 中我不能将 t2 限制为仅在实际父级上工作,因此它适用于整个表。有什么想法吗?

【问题讨论】:

    标签: mysql sql-update subquery


    【解决方案1】:

    看起来您需要向内联视图查询 (t2) 添加一个 GROUP BY 子句,以便它为每个 parent 返回一行。

    如果没有GROUP BY 子句,该查询将返回单行。 (您可以只运行 t2 查询,然后查看。)

    当我们添加 GROUP BY 子句时,我们应该返回 parent 的所有不同值,以及与每个父级关联的最小 number

    SELECT MIN(t2.number) AS minnumber
         , t2.parent AS parent 
      FROM t1 t2
     GROUP BY t2.parent
    

    【讨论】:

    • 啊,好吧。非常感谢!
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2021-11-11
    相关资源
    最近更新 更多