让这样的表:

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

第二个问题是:您如何看待上述查询?可以改善吗?有明显的不良做法吗?

预先感谢您的建议和帮助。

巴特

最佳答案

这样的事情会(未经测试):

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个所有Moname的记录-而不是每个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列(通常是主键),则应将其用于子查询联接以提高性能。

08-25 22:27