Удаление всех записей, кроме одной, и только со значением поля в типе - PullRequest
1 голос
/ 10 марта 2020

У меня есть MySQL Сценарий, который запускается в php - когда пользователь входит в систему, он удаляет все старые токены, кроме самых последних 3.

    DELETE tokens FROM tokens
    LEFT JOIN (    
    SELECT id
    FROM tokens
    WHERE users_id = :user_id
    ORDER BY access_time DESC
    LIMIT 3) AS newest
    ON tokens.id = newest.id
    WHERE tokens.users_id = :user_id AND newest.id IS NULL

Это прекрасно работает Однако я попытался изменить его так, чтобы он работал только для всех токенов, для которых установлен тип «API» или «APP»

Таким образом, теоретически 1 пользователь может иметь 3 токена API и 3 жетона APP в одной таблице.

Я пытался изменить эту строку

    WHERE tokens.users_id = :user_id AND newest.id IS NULL

на

    WHERE tokens.users_id = :user_id AND newest.id IS NULL AND tokens.type = "API"

Однако, похоже, это не сработало, но на самом деле это просто не дает никаких результатов ... что я делаю не так?

В моих таблицах есть следующие поля:

ТОКЕНЫ: id users_id токен create_time тип access_time

ПОЛЬЗОВАТЕЛИ: идентификатор электронной почты пароль активен проверен create_time

1 Ответ

0 голосов
/ 11 марта 2020

Вы думаете об этом просто немного неправильно.

Предложение WHERE, которое вы изменяете, содержится в операторе DELETE, но вы хотите изменить то, что сохраняется, а не то, что удаляется. Строки, которые вы хотите сохранить, определены в подзапросе в предложении FROM. Так вот, где вы хотите поставить свои новые условия. Возможно, есть более элегантный способ сделать это, но получите три из каждого type, я просто использовал UNION.

DELETE tokens
FROM tokens
LEFT JOIN 
(
  (SELECT id
   FROM tokens
   WHERE users_id =users_id AND tokens.type = "API"
   ORDER BY access_time DESC 
   LIMIT 3)
  UNION ALL
  (SELECT id
   FROM tokens
   WHERE users_id =users_id AND tokens.type = "APP"
   ORDER BY access_time DESC 
   LIMIT 3)
) AS newest 
    ON tokens.id = newest.id
WHERE 
  newest.id IS NULL;

Вот рабочая Rextester Demo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...