【发布时间】: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