2013-11-07 5 views
0

http://sqlfiddle.com/#!2/d21f3/1Удалить все строки из таблицы MYSQL кроме верха/низа 50 строк

У меня есть таблица с некоторыми записями здесь, я хочу сохранить только 50 сообщений в этой таблице отсортированы по message_id и УДАЛИТЬ остальные записей.

Пожалуйста, помогите мне с запросом.

Заранее спасибо.

+0

Таким образом, вы должны держать 50 от верхней и 50 снизу? && или ||? –

+0

Я должен хранить только 50 сообщений, основываясь на их message_id –

ответ

1

Например .

DELETE a 
    FROM chat_history a 
    LEFT 
    JOIN 
    (SELECT x.message_id 
     FROM chat_history x 
     JOIN chat_history y 
      ON y.message_id >= x.message_id 
     GROUP 
      BY x.message_id 
     HAVING COUNT(*) <= 50 
    ) b 
    ON b.message_id = a.message_id 
WHERE b.message_id IS NULL; 

http://sqlfiddle.com/#!2/361b4/1

1

Попробуйте это я использовал ORDER BY message_id DESC изменить его, как вы хотите это удалить все, кроме seleted 50 записей, я псевдонимы запроса, потому что вы не можете использовать тот же таблицу для выбора с операцией удаления

DELETE FROM `chat_history` WHERE id NOT IN (SELECT t.id FROM 
(SELECT id FROM chat_history ORDER BY message_id DESC LIMIT 50) t) 
+0

. УДАЛИТЬ ОТ chat_history WHERE MESSAGE_ID <(SELECT MESSAGE_ID FROM chat_history ORDER BY MESSAGE_ID DESC LIMIT 50,1) 'Быстрее? – ModulusJoe

+1

Yup это будет быстрее, но op не упомянул о желаемом порядке asc desc и одна вещь, которую вы не можете использовать в таблице при выборе операции при удалении –

+0

Нет, это не позволяет DELETE и SELECT в том же запросе, я думал о используя NOT IN, но я не могу использовать его вместе. –

Смежные вопросы