2011-09-29 71 views
1

我試圖選擇所有最近添加的項目。MySQL選擇所有最後添加的查詢

我一定要找到什麼是最後添加的考試(有時更多的是如下圖所示爲一個)

這裏是DB的一個例子。

id name    start_date end_date duration 
4 Exam August 2011 24.8.2011 0000-00-00 20 
3 Exam July 2011  28.7.2011 0000-00-00 20 
5 Exam August 2011 24.8.2011 0000-00-00 20 
6 Exam August 2011 24.8.2011 0000-00-00 20 
25 Exam September 2011 26.9.2011 07.10.2011 20 
26 Exam September 2011 26.9.2011 07.10.2011 20 
27 Exam September 2011 26.9.2011 07.10.2011 20 

這裏是我使用的查詢,我的問題是有沒有更好的方法來做到這一點?一些優化?

SELECT * FROM me_tests WHERE name = ( 
    SELECT name FROM me_tests ORDER BY start_date DESC LIMIT 1 
) 

第二個查詢會發現最後添加的名稱(相同的開始日期)之一,將它傳遞給第一選擇,並會選擇基於名稱的所有其他測試。

+1

爲什麼你不能只是''基於'start_date'?這不會比運行兩個查詢更簡單嗎? – sdleihssirhc

回答

1

如果最後添加的項目在同一時間添加但名稱不同,該怎麼辦?

在這種情況下,我會認爲你會想要這樣的查詢。

SELECT 
    * 
FROM me_tests 
WHERE start_date = (SELECT 
         start_date 
        FROM me_tests 
        ORDER BY start_date DESC LIMIT 1) 
+0

非常好。名稱不能不同(使用當前月份和年份自動生成)。不過,我真的很感謝你的替代方案。它會變得更快還是沒有區別? – Boris

+1

@Boris ...這個查詢與你的速度將取決於你的指數。我會考慮在start_date上創建一個索引。 –

3
SELECT * FROM me_tests ORDER BY start_date DESC LIMIT 1 

或者 -

SELECT * FROM me_tests 
WHERE start_date = 
(SELECT MAX(start_date) FROM me_tests); 
+0

我不能限制1,因爲你可以看到我有3行添加26.09.2011 – Boris

+0

第二個將工作,但我認爲從性能,優化,角度來看它會是一樣的嗎?或不? – Boris

+0

@Boris:我認爲你需要在條件不是名字的情況下使用start_date。 –

1

我會用

SELECT * FROM me_tests ORDER BY start_date DESC LIMIT 1 

...除了使用*是壞的,所以你應該命名所有你想要檢索的列。

+0

我不能限制1,因爲你可以看到我在26.09.2011添加了3行。感謝有關*的建議。 – Boris

+0

所以你想要最後三個?或者你想'命令由start_date DESC,id DESC LIMIT 1'? – Kalessin

+0

我想要最後添加的(可能是一個,可能不止一個)。實際上,我想知道是否有更好的(從表演)的觀點比我做的。 – Boris