【问题标题】:MySQL : selecting the X smallest valuesMySQL:选择 X 最小值
【发布时间】:2010-10-21 07:55:32
【问题描述】:

做一张这样的桌子:

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

第二个问题是:你觉得上面的查询怎么样?可以改进吗?有什么明显的坏习惯吗?

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

巴特

【问题讨论】:

  • 您的意思是选择所有不是该 moname 的最新行的行吗?或者只是每个 moname 固定 X 行?
  • 每个 moname 固定 X 行,这些行是最旧的。

标签: mysql optimization select conditional-statements


【解决方案1】:

类似这样的工作(未经测试):

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 条。让我想想。

再来一个(诚然,这个看起来有点复杂):

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

【讨论】:

  • 确实这比我之前的查询好很多。谢谢!
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 2013-04-03
  • 2023-01-13
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多