2013-02-20 52 views
1

我在嘗試更新visitors中的一列。我還在更新查詢的SET部分使用了sub select語句。mySQL:UPDATE命令中的子SELECT語句

UPDATE 
    visitors AS v 
SET 
    v.IsFirstVisit = (SELECT COUNT(*) FROM visitors AS v2 WHERE ..... LIMIT 1) 

但是,從MySQL返回該錯誤消息

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

我不知道爲什麼我不能在內部SELECT語句中訪問「V」的對象。我也不想使用多個語句,因爲這會導致性能問題。

問題:如何在內部select中使用'v'對象?

更新: 這是整個查詢

UPDATE 
    visitors AS v 
SET 
    IsFirstVisit = (SELECT Count(*) FROM visitors AS v2 WHERE v2.VisitorId < v.VisitorId AND v2.IP = v.IP AND v2.DateTime > v.DateTime [TODO:SUBTRACT30MINUTES] LIMIT 1) 
WHERE 
    VisitorId = "991" 

回答

1

我猜你在找這個

UPDATE 
    visitors 
SET 
    IsFirstVisit = (SELECT COUNT(*) FROM visitors WHERE ..... LIMIT 1) 

編輯:

試試這個

UPDATE 
     visitors 
    SET 
     IsFirstVisit = (SELECT Count(*) FROM visitors v2 inner join visitors v 
     ON v.VisitorId = v2.VisitorId WHERE v2.IP = v.IP AND v2.DateTime > v.DateTime AND v2.VisitorId < v.VisitorId [TODO:SUBTRACT30MINUTES] LIMIT 1) 
    WHERE 
    VisitorId = "991" 
+0

,因爲我有內部的「......」訪問WHERE子句的遊客都對象是行不通的。 – bytecode77 2013-02-20 17:49:01

+0

你能顯示你的整個sql嗎? – 2013-02-20 17:51:39

+0

我將整個查詢添加到問題中。 – bytecode77 2013-02-20 17:59:24

1

inner joinUPDATE聲明不會是一個壞主意。

UPDATE 
    visitors inner join (SELECT COUNT(*) as test FROM visitors v) as v 
SET 
    isfistvisit = v.test; 

另一個解決方法,我不是一個很大的粉絲。

update visitors 
    set isfistvisit = (
     select count(*) from (
     select count(*) from visitors 
    ) as x 
    ) 

Demo