2010-10-26 221 views
3

這是我的表:如何避免子查詢?

ID KEY VALUE 
1 alpha 100 
2 alpha 500 
3 alpha 22 
4 beta 60 
5 beta 10 

我想檢索所有KEY -s他們最新值的列表(其中ID是其最大):

ID KEY  VALUE 
3 alpha 22 
5 beta 10 

在MySQL我正在使用這個查詢,這是無效的:

SELECT temp.* FROM 
    (SELECT * FROM t ORDER BY id DESC) AS temp 
GROUP BY key 

是否有可能在這種情況下避免子查詢?

回答

5

使用INNER JOIN加入您的最大ID。

SELECT t.* 
FROM t 
     INNER JOIN (
      SELECT ID = MAX(ID) 
      FROM t 
      GROUP BY 
        key 
     ) tm ON tm.ID = t.ID     

假設ID列被編入索引,這可能與其將要獲得的一樣快。

+0

MySQL將創建** **許多臨時表,而在我的例子中有將只有一個。你確定你的SQL更快嗎? – yegor256 2010-10-26 06:51:38

+1

我沒有運行MySQL,但試用兩個版本並比較兩個計劃以確定最佳解決方案應該不難。只使用5個ID的SQL Server,這兩種解決方案的執行速度同樣快。使用13個ID,LEFT JOIN解決方案佔55%,INNER JOIN解決方案佔45%。當你的表增長時,你可以預期這種差異會變得更加明顯。 *注意:ID列是主鍵,值列上有一個索引* – 2010-10-26 07:45:17

+0

...應該讀*「鍵列上有一個索引」* – 2010-10-26 07:57:47

3

這裏是the mysql documentation page that discusses this topic

它提出了三個不同的選項。

,不涉及一個子查詢中只有一個是:

SELECT t1.id, t1.k, t1.value 
FROM t t1 
LEFT JOIN t t2 ON t1.k = t2.k AND t1.id < t2.id 
WHERE t2.k IS NULL; 
+0

這正是我所期待的,謝謝! – yegor256 2010-10-26 07:14:45

+0

糟糕,這個查詢速度比我原來的慢10倍(我的表格中有2毫米行)... – yegor256 2010-10-26 07:55:46

+1

:-)原來的問題是「如何避免子查詢」......不是「如何使最有效的查詢「。我相信選擇使用哪個查詢來獲得最佳性能取決於您在表中有多少行,以及'key'有多少個唯一值。很高興你把它整理出來。 – Lee 2010-10-26 08:35:18