2012-03-13 30 views
0

在我的customer表中,ref是自動增量,ID是客戶標識號。因此,每個客戶有多個ID(這構成了每個客戶的歷史記錄)。我想通過在所有情況下將likelihood字段設置爲1來更新每個客戶的最新記錄 - 但不創建新記錄。在MySQL中選擇某些記錄後進行更新

我覺得像這樣的查詢將做的工作:

UPDATE customer SET likelihood = 1 WHERE customer.ref IN (SELECT MAX(ref) FROM customer GROUP BY ID)

,但我得到了以下錯誤:

"#1093 - You can't specify target table 'customer' for update in FROM clause"

我要去哪裏錯了?

編輯: 一些樣本數據(而不是完整的表)

ref | ID | likelihood | name 
----+----+------------+----- 
    1 | 1 |   0 | a 
    2 | 2 |   0 | b 
    3 | 1 |   0 | a 
    4 | 2 |   0 | b 
    5 | 1 |   0 | a 
    6 | 1 |   0 | a 

所以我想挑選出:

4 | 2 |   0 | b 
    6 | 1 |   0 | a 

並將其更改爲:

4 | 2 |   1 | b 
    6 | 1 |   1 | a 
+0

你可以發佈一些樣本數據... – Teja 2012-03-13 17:37:23

+0

是你粘貼的錯誤是否準確?當查詢位於「客戶」表上時,錯誤引用表'客戶'。 – kclair 2012-03-13 17:41:02

+0

@kclair正確的消息,錯誤的表 - 編輯,謝謝 – user114671 2012-03-13 17:44:59

回答

3

我不記得它是否允許自我加入更新。這給一個嘗試 -

UPDATE customer c1 
LEFT JOIN customer c2 
    ON c1.ID = c2.ID 
    AND c1.ref < c2.ref 
SET c1.likelihood = 1 
WHERE c2.ID IS NULL 

編輯我已經改變了從ID的第二個連接條件使用REF列。

+0

謝謝,'JOIN'看起來像答案,但該查詢更改每個不是1的可能性。1 – user114671 2012-03-13 18:11:26

+1

我的歉意。我不知道我是如何在連接的第二個條件中使用ID而不是ref的。它現在應該工作。 – nnichols 2012-03-13 18:45:29

+0

這工作完美,非常感謝幫助我與此。 – user114671 2012-03-14 10:37:51

2

你出現錯誤是因爲您無法更新您正在選擇的表格。你正在寫的where子句是從客戶表中選擇,所以你不能寫它在更新

你可能會需要兩個查詢拉這一關,如下列:

SELECT @max_ref:=max(ref) FROM customers; 
UPDATE customers SET likelihood=1 WHERE [email protected]_ref 
+0

謝謝,但那是返回「#MySQL返回一個空的結果集(即零行)。」 – user114671 2012-03-13 17:48:56

+0

我不知道如何知道爲每位客戶選擇最新的ID? – user114671 2012-03-13 17:50:28

+0

哦,對不起,我錯過了它必須更新每個客戶的部分 – jeffchong07 2012-03-13 17:54:47