2017-02-03 1 views
1

Я хотел бы удалить все, кроме последних 20 тестов пользователя из таблицы, в которой есть несколько пользователей.SQL удаляет строки после выбора запроса с ограничением

попытка 1:

DELETE FROM tests WHERE EXISTS (SELECT * FROM tests WHERE user_id = 38 ORDER BY test_timestamp DESC LIMIT 20, 100); 

попытка 2:

DELETE FROM tests WHERE user_id = 38 ORDER BY test_timestamp DESC LIMIT 20, 100; 

Есть ли какие-либо изменения, которые я могу сделать любой из указанных выше образцов на работу или сделать мне нужно использовать PHP, чтобы настроить ROWCOUNT переменная, чтобы обойти мою проблему со смещением?

+0

Что было результатом попытки 2? –

+0

# 2 error: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего MySQL-сервера, для правильного синтаксиса для использования около «100» в строке 1 –

ответ

0

В MySQL, вы можете сделать это с помощью join:

DELETE t 
    FROM tests t JOIN 
     (SELECT tt.timestamp 
      FROM tests tt 
      WHERE t.user_id = 38 
      ORDER BY tt.timestamp DESC 
      OFFSET 19 LIMIT 1 
     ) tt 
     ON t.user_id = tt.user_id and t.timestamp < tt.timestamp; 

Чем больше два «Очевидные» методы не поддерживаются MySQL.

  • MySQL не поддерживает OFFSET в предложении LIMIT для DELETE.
  • MySQL не поддерживает операции в предложении WHERE измененной таблицы (без добавления дополнительного осложнения к запросу).
0

Для попытки 1, это правильный синтаксис

delete from tests 
where the primary key field in 
(select the primary key field 
etc 
) 
1

Try:

DELETE FROM tests 
WHERE tests.user_id = 38 
and tests.ID in (SELECT id 
FROM tests t 
WHERE t.user_id = tests.user_id 
ORDER BY test_timestamp DESC LIMIT 20, 100); 
+0

При попытке вывести следующее сообщение было получено следующее сообщение: # 1235 - эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery '(Моя версия - 5.6.33-log) Спасибо за помощь, хотя –

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