2015-10-29 4 views
0

Это структура таблицыНужен оператор запроса SQL для этого случая

mysql> select * from p1; 
+----------+-------+-----------+ 
| username | token | last_used | 
+----------+-------+-----------+ 
| a  | aacs |   5 | 
| d  | dddd |   3 | 
| a  | aaaaa |   3 | 
+----------+-------+-----------+ 

Как я могу удалить запись, который имеет минимальное last_used значения из набора запрашиваемого по имени пользователя? В этом случае данный параметр имени пользователя является «a», затем я удаляю запись «a», «aaaaa», 3, потому что 3 меньше 5 (имя пользователя last_used (5) - «a», слишком).

Мой ответ

delete from persistent_logins 
where last_used=(select * 
       from (select MIN(last_used) 
         from persistent_logins where username=?)as t 
       ) 
    and username=? 

, но это полезно, мне нужно такое заявление delete .... from..where username=? Это важно, что только один параметр является allowed.But мой ответ имеет два параметра.

ответ

1

Фактически вы можете использовать ORDER BY и LIMIT с DELETE. Строки будут удалены в том порядке, в котором LIMIT будет контролировать количество удаленных.

Если указано условие ORDER BY, строки удаляются в указанном порядке. Предложение LIMIT ограничивает количество строк, которые можно удалить.

(От: https://dev.mysql.com/doc/refman/5.0/en/delete.html)

Попробуйте что-то вроде этого:

DELETE FROM p1 
WHERE username = ? 
ORDER BY last_used ASC 
LIMIT 1 
+1

Я собирался создать 'row_id', но похоже, что это должно работать. Но в первый раз я увидел это немного страшно. –

+0

Да, вы должны быть осторожны с 'DELETE'. Когда я писал ответ, я немного испугался, что неправильно набрал запрос. Я предлагаю создать базу данных * test *, чтобы сначала запустить эту функцию, чтобы дважды проверить. Кроме того, вы можете сделать SELECT * FROM p1 WHERE username =? ORDER BY last_used ASC LIMIT 1', чтобы увидеть, какие строки будут удалены. Вы также можете запустить 'DELETE' внутри транзакции (я думаю) и дважды проверить (используя' SELECT'), чтобы все было нормально, прежде чем совершать транзакции. –

+0

Спасибо за ваш ответ на терпение, я также подумал о ответе. Спасибо – bay1ts

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