2015-10-29 91 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 BYLIMITDELETE。这些行将按照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