2009-04-23 179 views
0

令是這樣的一個表:MySQL的:選擇X最小值

CREATE TABLE `amoreAgentTST01` (
    `moname` char(64) NOT NULL DEFAULT '', 
    `updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `data` longblob, 
    PRIMARY KEY (`moname`,`updatetime`) 

我有一個查詢查找每個獨立的「moname」最古老的記錄,但只有當有多個記錄本「 moname':

SELECT moname, updatetime FROM amoreAgentTST01 a 
WHERE (SELECT count(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1 
    AND a.updatetime = (SELECT min(updatetime) FROM amoreAgentTST01 y WHERE y.moname = a.moname) ; 

我的問題是:如何做到這一點,但選擇X最古老的值? 我現在只是運行這個,刪除最舊的值並重新運行它......這不是很好。

秒問題是:你怎麼看待上面的查詢?可以改進嗎?有沒有明顯的不良做法?

非常感謝您的建議和幫助。

巴特

+0

你的意思是選擇不是該moname的最新行的所有行嗎?或者每個moname只有一個常量X行? – NickZoic 2009-04-23 09:57:34

+0

每個moname有恆定的X行,這些行是最老的行。 – Barth 2009-04-23 10:00:35

回答

3

會是這樣的工作(未經測試):

SELECT moname, MIN(updatetime) FROM amoreAgentTST01 
GROUP BY moname HAVING COUNT(moname)>1 

編輯 - 以上僅僅意味着作爲現有代碼的替代品,所以它並不直接回答你的問題。

我覺得這樣的事情應該爲你的主要問題的工作:

SELECT moname, updatetime FROM amoreAgentTST01 
GROUP BY moname, updatetime 
HAVING COUNT(moname)>1 
ORDER BY updatetime LIMIT 0, 10 

編輯 - 而不是10最古老的 - 對不起,上面不會有,因爲它僅返回10條記錄所有monames工作每。讓我有一個想法。

一個多了去了在這個(當然,這個看起來有點令人費解):

SELECT a.moname, a.updatetime FROM amoreAgentTST01 a 
WHERE EXISTS 
(SELECT * FROM amoreAgentTST01 b 
WHERE a.moname = b.moname AND a.updatetime = b.updatetime 
ORDER BY b.updatetime LIMIT 0, 10) 
AND (SELECT COUNT(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1 

我要補充一點,如果有一個ID列 - 一般主鍵 - 那麼就應該被用於子查詢連接以提高性能。