我有一個名爲「父母」的主表和一個名爲「childs」的相關表有沒有一種方法來優化此更新查詢?
現在我運行一個查詢主表來更新一些值與子表的總和像這樣。
UPDATE master m SET
quantity1 = (SELECT SUM(quantity1) FROM childs c WHERE c.master_id = m.id),
quantity2 = (SELECT SUM(quantity2) FROM childs c WHERE c.master_id = m.id),
count = (SELECT COUNT(*) FROM childs c WHERE c.master_id = m.id)
WHERE master_id = 666;
它按預期工作,但不是一個好的風格,因爲我基本上對同一個結果做出多個SELECT查詢。有沒有一種方法來優化? (第一,查詢數據和存儲的值不是一個選項
我嘗試這樣做:
UPDATE master m SET (quantity1, quantity2, count) = (
SELECT SUM(quantity1), SUM(quantity2), COUNT(*)
FROM childs c WHERE c.master_id = m.id
) WHERE master_id = 666;
但不起作用
更新:這裏是解決方案,這要歸功於感到沉淪:
你可以做這樣的事情:
UPDATE master m
INNER JOIN childs c ON m.master_id = c.master_id
SET master.quantity1 = c.quantity1,
master.count = 1
如果一次只有一個孩子記錄。但是,如果您想在連接的表中使用像SUM()這樣的組函數不起作用。要麼你得到一個「無效使用組功能的」如果「按組」部分或離開一個GROUP BY c.master_id‘
-- This doesnt work :(
UPDATE master m
INNER JOIN childs c ON m.master_id = c.master_id
SET master.quantity1 = SUM(c.quantity1),
master.count = COUNT(c.*)
GROUP by c.master_id
的解決方案「,如果您使用您的SQL語法錯誤’是使用一個子查詢JOIN:
UPDATE master m
INNER JOIN
(
SELECT master_id,
SUM(quantity1) as quantity1,
COUNT(*) as count
FROM childs c
GROUP BY master_id
) c
ON c.master_id = m.master_id
SET m.quantity1 = c.quantity1,
m.count = c.count
WHERE m.master_id = 666;
但由於這從childtable拉每一行的開銷可能比使用更多的子查詢像原來的SQL更大,所以你應該在WHERE子句添加到連接的。表只能得到你需要的行
另一個有趣的方法就是這種語法,它與JOIN和WHERE子句的作用相同,但只有在您想更新具有相同值的所有行並且子查詢僅返回一行時才應使用,因爲子查詢的結果會附加到結果並可以像任何列一樣使用。
UPDATE master m,
(
SELECT SUM(c.quantity1) as sum_of_quantity,
COUNT(*) as rowcount FROM child c WHERE c.master_id = 666
) as c
SET m.quantity1 = c.sum_of_quantity,
m.count = c.rowcount
WHERE m.master_id = 666;
你嘗試過更新之前做你的計數,並將其存儲伊娜變量傳遞到您的更新? – 2010-06-17 11:22:39
你有哪個錯誤?您的更新是正確的。 – ksogor 2010-06-17 11:31:25
它看起來像你有幾個應該在下面工作的答案,但只是想指出,這似乎是重複的列和重複的數據之間非常規範化的設計。 – 2010-06-17 13:55:50