2014-08-28 53 views
0

的子集的最小更新表這是我的測試數據庫:MySQL的:與表

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):您不能指定目標表 'T1' 的更新在FROM子句

我理解的方式將是一個JOIN ,但我沒有得到我t right:

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只在實際的父母上工作,所以它在整個表上工作。任何想法?

回答

2

看起來您需要將GROUP BY子句添加到內嵌視圖查詢(t2),以便它爲每個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 
+0

啊,好的。非常感謝! – Werner 2014-08-28 19:28:52