gpt4 book ai didi

MySQL : selecting the X smallest values

转载 作者:行者123 更新时间:2023-11-29 06:24:26 24 4
gpt4 key购买 nike

让表格像这样:

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

编辑 - 抱歉,上面的方法不起作用,因为它只返回所有 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 列(通常是主键),那么应该将其用于子查询连接以提高性能。

关于MySQL : selecting the X smallest values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/781044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com