УДАЛИТЬ строки в операторе SELECT на основе условия

У меня очень простая таблица, где я храню баны игроков. Здесь всего два столбца (не на самом деле, но для простоты) - уникальный идентификатор игрока (uid) и дата истечения бана (expiredate).

Я не хочу оставлять в таблице просроченные запреты, поэтому нужно удалить все запреты, срок действия которых истек ‹currentdate.

Чтобы узнать, забанен ли игрок, я запрашиваю в этой таблице его uid и текущую дату, чтобы узнать, есть ли какие-либо записи. Если есть - определяем, что игрок забанен.

Поэтому мне нужно выполнить два запроса. Один, который принесет мне запреты, и другой, который очистит таблицу от лишних запретов.

Мне было интересно, можно ли эти запросы объединить в один. Выберите и верните запись, если она все еще актуальна, и удалите запись и ничего не верните, если это не так.

Есть ли какие-нибудь хорошие способы сделать это в одном запросе выбора?

Редактировать:

Чтобы уточнить, у меня действительно есть другая информация в таблице, такая как причина бана, дата бана и т. Д., Поэтому мне нужно вернуть строку, а также удалить нерелевантные записи.


person Samuel Moriarty    schedule 21.08.2015    source источник
comment
Лучше сделать это отдельно: для выбранного сравните дату истечения срока действия с текущей датой. Таким образом, пользователю, который выбирает, не нужны права на удаление для таблицы. Удаление можно производить в рамках задачи один раз в день.   -  person Koryu    schedule 21.08.2015


Ответы (2)


К сожалению, у вас не может быть оператора удаления внутри оператора select ... Я получил вам ссылку из sqlite docos Для справки.

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

В вашем случае вы должны выполнить два оператора отдельно.

person The Fabio    schedule 21.08.2015
comment
почему вы пригласили, я до сих пор не знаю. : D - person Arup Rakshit; 23.08.2015

delete from player_bans p
where exists (
select 1 from player_bans 
where p.uid = uid
and expire_date < current_date)

Это то, что вы пытаетесь сделать?

person Vamsi Prabhala    schedule 21.08.2015
comment
Я не уверен. Возвращает ли это строки, если есть соответствующие запреты? В основном я пытаюсь объединить что-то вроде (выберите * из player_bans, где uid = '...' и expire_date ›current_date) и (удалить из player_bans, где expire_date‹ current_date) - person Samuel Moriarty; 21.08.2015
comment
Не лучше ли запускать эти запросы отдельно? - person Samuel Moriarty; 21.08.2015