2013-02-20 4 views
1

Я пытаюсь обновить столбец в visitors. Я также использую инструкцию sub select для части запроса SET.mySQL: инструкция Sub SELECT в команде UPDATE

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 

Я понятия не имею, почему я не могу получить доступ к «V» объект в пределах внутреннего оператора выбора. Я также не хочу использовать несколько операторов, так как это может вызвать проблемы с производительностью.

Вопрос: Как использовать объект «v» во внутреннем выборе?

Update: Это весь запрос

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

Это не будет работать, так как у меня есть доступ к обоим объектам посетителя внутри «....» в ИНЕКЕ. – bytecode77

+0

можете ли вы показать весь свой sql? –

+0

Я добавил весь вопрос к вопросу. – bytecode77

1

inner join в заявке 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 
    ) 

Demo