MySQL:选择X最小值

时间:2009-04-23 09:54:30

标签: mysql optimization select conditional-statements

让我们成为这样的表:

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最旧的值? 我现在只需运行它,删除最旧的值并重新运行它......这不太好。

秒问题是:您对上述查询有何看法?可以改进吗?有没有明显的不良做法?

提前感谢您的建议和帮助。

巴特

1 个答案:

答案 0 :(得分: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

编辑 - 抱歉,上面的内容不起作用,因为它只返回所有monames的10条记录 - 而不是每条记录的10条记录。让我想一想。

还有一个人(不可否认,这个看起来有点复杂):

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列 - 通常是主键 - 则应该用于子查询连接以提高性能。