2012-01-30 57 views
0

我有如下查詢:Mysql中的嵌套查詢更新?

SELECT `peers`.uid, `user`.userid FROM `peers`, `user` WHERE `user`.userid = `peers`.uid 

的FF。是查詢的結果

userid,uid 
1,1 
1,1 
1,1 
3,3 
96,96 
96,96 

要更新的這個結果,我有FF查詢設置:

UPDATE `user` 
    INNER JOIN ( 
    SELECT `peers`.uid, `user`.userid FROM `peers`, `user` WHERE `user`.userid = `peers`.uid 
     ) AS my_current_select ON `user`.userid = my_current_select.userid 
    SET `user`.credits = `user`.credits + 0.25 

但是,更新查詢更新只有3次,每加一次0.25貸方userID 1,3,96

這不是我想要的。我想在查詢的每個行結果中唯一地添加0.25個信用點。
例如:

UID 1: UID1.credit = UID1.credit + 0.25 * 3 
UID 3: UID3.credit = UID3.credit + 0.25 * 1 
UID 3: UID96.credit = UID96.credit + 0.25 * 2 

我怎樣才能實現這個結果?

+0

這可以通過獲取查詢的結果並將其循環來輕鬆進行歸檔。然而,這種表現毫無疑問。我正在試圖在1個查詢中執行此操作 – DucDigital 2012-01-30 02:04:18

回答

4

你內心的查詢可能更改爲:

SELECT `user`.userid, COUNT(`peers`.uid) as count 
FROM `peers`, `user` 
WHERE `user`.userid = `peers`.uid 
GROUP BY `user`.userid 

得到:

userid,count 
1,3 
3,1 
96,2 

然後在您的主查詢中:

UPDATE `user` 
    INNER JOIN ( 
    SELECT `user`.userid, COUNT(`peers`.uid) as count 
    FROM `peers`, `user` 
    WHERE `user`.userid = `peers`.uid 
    GROUP BY `user`.userid 
     ) AS my_current_select ON `user`.userid = my_current_select.userid 
    SET `user`.credits = `user`.credits + 0.25*my_current_select.count 
+0

這是完美的:)非常感謝你。很容易理解:) – DucDigital 2012-01-30 02:51:57

0
UPDATE `user` 
SET credits=credits+0.25 
WHERE userid IN (
    SELECT `user`.userid 
    FROM `peers`, `user` 
    WHERE `user`.userid = `peers`.uid 
) 

這就是所謂的嵌套查詢,當你正確地推測。事實上,你需要加入的唯一原因是因爲你只選擇了這兩個userpeers表中的條目(這是一個隱含的內部連接)。

如果你只是要更新所有用戶,不管他們是否是在peers,你可以這樣做:

UPDATE `user` SET credits=credits+0.25 
+0

此原因:'#1093 - 您無法在FROM子句中指定目標表'user'進行更新。 MySQL不允許這種查詢? :) – DucDigital 2012-01-30 02:29:58

0
update u 
set u.credit = u.credit + (0.25 * c.credits) 
from user u 
join (select us.userid, count(p.uid) as credits 
     from user us join peers p on us.userid = p.uid 
     group by us.userid) c 
    on u.userid = c.userid 

真的,反引號是完全沒有必要,除非你的表名稱包含特殊字符或保留字。我還希望首先放置SET子句,我認爲這對可讀性有幫助(在定義數據源之前說明您打算先做什麼)。另外,我強烈建議使用實際連接語法(ON),而不要使用where子句,如果你使用別名,你的生活會更簡單。