2013-02-19 68 views
3

我想知道为什么像select * as t这样的语句出现在如下所示的mysql子查询中。Mysql子查询语法

以下根据created_time列删除表中最旧的3行。

为什么这是正确的

DELETE FROM mytable WHERE id = ANY 
(SELECT * FROM (SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3')as t) 

,而不是

DELETE FROM mytable WHERE id = ANY 
(SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3) 

对我来说,第二种形式是有道理的。它不工作,我想了解为什么第一个是必要的。具体来说,什么是tas t是做什么的?

+2

这是愚蠢的MySQL限制之一。第二个声明适用于所有其他DBMS。即使第一个被接受,我也记得它的一些问题。你只是不能使用你在MySQL中的一个子选择中删除的表,你需要使用一个连接 – 2013-02-19 16:56:50

+2

@a_horse_with_no_name:这个解决方法的例子不能按预期工作:** [MySQL子查询的问题](http: //dba.stackexchange.com/questions/1371/problem-with-mysql-subquery)** – 2013-02-19 17:05:39

+0

@ypercube:谢谢,那正是我心中所想;) – 2013-02-19 17:35:22

回答

3

在许多数据库中,from子句中的子查询需要显式别名。 as是可选的。我通常使用as为列和离开它,为表:

DELETE FROM mytable 
    WHERE id = ANY (SELECT * FROM (SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3') t) 

为什么你需要的子查询的MySQL的奇思妙想。它不允许deleteupdate中的表引用出现在子查询子句中。噢,它确实允许它在子查询子查询子句中。所以,解决这个限制很容易。

+0

啊我陷入了困境。谢啦 – rocketas 2013-02-19 18:57:20