1

の列を更新しようとしていますvisitorsSETまた、更新クエリの一部にsubselectステートメントを使用しています。

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」オブジェクトにアクセスできない理由がわかりません。また、パフォーマンスの問題が発生する可能性があるため、複数のステートメントを使用したくありません。

質問:内部選択内で「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"
4

2 に答える 2

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"
于 2013-02-20T17:03:02.717 に答える
1

inner joininステートメントはUPDATE悪い考えではありません。

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
      )

デモ

于 2013-02-20T17:10:35.743 に答える