代码之家  ›  专栏  ›  技术社区  ›  Barth Arun Karunagath

MySQL:选择x最小值

  •  0
  • Barth Arun Karunagath  · 技术社区  · 15 年前

    像这样的桌子:

    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 回复  |  直到 15 年前
        1
  •  3
  •   BrynJ    15 年前

    是否希望此工作(未测试):

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