2010-09-01 2 views
0

Прежде всего, извинения за ужасный титул Я не мог придумать лучшего способа сформулировать мою проблему. (Не стесняйтесь предлагать лучшие альтернативы)MySQL UPDATE - выборочное обновление

В принципе у меня есть стол со столбцом «count». Я хочу сбросить все значения до нуля, за исключением 10 строк с верхними значениями. Я хочу, чтобы они были сброшены на 0.

Как достичь этого без написания нескольких запросов?

Update У меня есть запрос, как следующий в настоящее время

UPDATE covers AS t1 
    LEFT JOIN (SELECT t.cover_id 
       FROM covers t 
       ORDER BY t.cover_views DESC 
       LIMIT 10) AS t2 ON t2.id = t.id 
    SET cover_views = 0 
    WHERE t2.id IS NULL 

я получаю ошибку #1054 - Unknown column 't2.id' in 'where clause' - любая идея, почему?

Я также попытался следующие с тем же результатом

UPDATE covers t1 
    LEFT JOIN (SELECT t.cover_id 
       FROM covers t 
       ORDER BY t.cover_views DESC 
       LIMIT 10) t2 ON t2.id = t.id 
    SET t1.cover_views = 0 
    WHERE t2.id IS NULL 
+0

Есть ли столбец идентификатора или столбца первичного ключа? – MikeTWebb

+0

Yup, первичный ключ – Chris

+0

@ Крис ... похоже, что @Wadhi ответил на это уже. – MikeTWebb

ответ

1

попробовать:

update <table> t 
left outer join 
(
select id from <table> order by <counter> desc limit 10 
) c on c.id = t.id 
set 
<counter> = 0 
where 
c.id is null; 
+0

Это сработало, спасибо! – Chris

0

Вы можете использовать подзапрос:

update A set count = 0 where A.id not in 
(select id from A order by count desc limit 10) 
+0

Ошибка MySQL 1093 - не может указать целевую таблицу для обновления в предложении FROM. Для получения дополнительной информации см. Http://stackoverflow.com/questions/3620940/deleting-a-row-based-on-the-max-value/3621005#3621005 –

+0

@OMG Ponies: Спасибо OMG Ponies. Как вы исправите код? –

+0

Если вы поместили подзапрос между UPDATE и возвращаемым данными в подзапрос, MySQL примет его - в приведенной ссылке есть пример. –

2

Использование:

UPDATE TABLE t1 
    LEFT JOIN (SELECT t.id 
       FROM TABLE t 
      ORDER BY t.id DESC 
       LIMIT 10) t2 ON t2.id = t1.id 
    SET TABLE.count = 0 
WHERE t2.id IS NULL 
+0

Спасибо, что это выглядит отлично, в любом случае я могу установить все из объединенной таблицы, чтобы быть 1 в одном запросе, или мне нужно сделать другое? – Chris

+0

У меня возникла небольшая проблема с реализацией вашего запроса - я обновил вопрос - не могли бы вы взглянуть? – Chris

+0

следите за заказом на t.id desc limit 10 - вы сказали «Я хочу сбросить все отсчеты до нуля, кроме 10 строк с верхними значениями», так что, возможно, это должен быть порядок от desc limit 10 –