2009-04-23 180 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列 - 一般主键 - 那么就应该被用于子查询连接以提高性能。