2013-04-03 5 views
4

По какой-то причине этот запрос UPDATE вечен навсегда. Если я заменю на SELECT - он получит результат мгновенно.Update Inner Join Freeze

UPDATE table1 AS t1 
INNER JOIN 
(
    SELECT count(*) as total, left(number,7) as prefix, outcome FROM table1 
    where outcome like '%Passed%' 
    group by prefix 
    order by total desc limit 200 
) AS t2 
ON t2.prefix = left(t1.number,7) AND t1.outcome = 'Fail' 
SET t1.outcome = '', t1.status = 'NEW' 

Что там не так?

ответ

1

Я хотел бы попробовать что-то вроде этого:

UPDATE table1 
SET 
    table1.outcome = '', 
    table1.status = 'NEW' 
WHERE 
    outcome = 'Fail' 
    AND 
    left(number,7) IN (SELECT * FROM (
    SELECT left(number,7) as prefix 
    FROM table1 
    WHERE outcome like '%Passed%' 
    GROUP BY prefix 
    ORDER BY COUNT(*) desc limit 200 
    ) s 
) 

Пожалуйста, смотрите скрипку here.

+1

Я думаю, что вам не хватает 'count (*)'? –

+0

@ I'll-Be-Back Да, спасибо, я исправил его – fthiella

2

Попробуйте переместить ORDER BY и LIMIt в начало страницы UPDATE. Что-то вроде:

UPDATE table1 AS t1 
INNER JOIN 
(
    SELECT count(*) as total, left(number,7) as prefix, outcome FROM table1 
    where outcome like '%Passed%' 
    group by prefix 
) AS t2 ON t2.prefix = left(t1.number, 7) AND t1.outcome = 'Fail' 
SET t1.outcome = '', t1.status = 'NEW' 
order by total desc 
limit 200; 

См. Синтаксис UPDATE.

+0

Вы правы, спасибо –

+0

Я думал о том, чтобы сделать то же самое ... но я не уверен, я думаю, что исходный запрос мог заменить более 200 строк – fthiella

+0

@fthiella - Я тоже не уверен, но в этом case это может быть сделано в предложении 'WHERE', используя предикат' IN': 'UPDATE ... WHERE prefix IN (... LIMIT)' –

0

Можете ли вы обновить колонку, с которой вы соединяетесь? То есть, t1.outcome.

Переместить выражение фильтра t1.outcome = 'Fail' из JOIN и в статью WHERE.

UPDATE table1 AS t1 
INNER JOIN 
(
    SELECT count(*) as total, left(number,7) as prefix, outcome FROM table1 
    where outcome like '%Passed%' 
    group by prefix 
    order by total desc limit 200 
) AS t2 
ON t2.prefix = left(t1.number,7) 
SET t1.outcome = '', t1.status = 'NEW' 
WHERE t1.outcome = 'Fail'