2013-02-19 67 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