【问题标题】:How to SELECT by MAX(date)?如何按 MAX(日期)选择?
【发布时间】:2011-12-11 18:29:51
【问题描述】:

这是表结构:

CREATE TABLE `reports` (
  `report_id` int(11) NOT NULL auto_increment,
  `computer_id` int(11) NOT NULL default '0',
  `date_entered` datetime NOT NULL default '1970-01-01 00:00:00',
  `total_seconds` int(11) NOT NULL default '0',
  `iphone_id` int(11) default '0',
  PRIMARY KEY  (`report_id`),
  KEY `computer_id` (`computer_id`),
  KEY `iphone_id` (`iphone_id`)
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1

我需要一个SELECT 语句,该语句将列出最新输入的computer_id 中的report_id date_entered,但我不知道该怎么做。

【问题讨论】:

    标签: mysql sql select max


    【解决方案1】:

    应该这样做:

    SELECT report_id, computer_id, date_entered
    FROM reports AS a
    WHERE date_entered = (
        SELECT MAX(date_entered)
        FROM reports AS b
        WHERE a.report_id = b.report_id
          AND a.computer_id = b.computer_id
    )
    

    【讨论】:

    • 差不多。我遗漏了“a.report_id = b.report_id”,这就成功了。谢谢
    • 这有点低效,因为您生成的子查询太多。相反,请尝试使用不相关的子查询。 dev.mysql.com/doc/refman/5.6/en/…
    • 巴勃罗是正确的。过滤可以通过加入子查询提前完成,从而节省性能。
    【解决方案2】:

    您只是希望它显示最后输入的日期,还是从输入的最后一个日期开始排序?

    SELECT report_id, computer_id, date_entered
    FROM reports
    GROUP BY computer_id
    ORDER BY date_entered DESC
    -- LIMIT 1 -- uncomment to only show the last date.
    

    【讨论】:

    • 当 id 执行此操作时,我得到了错误的 report_id。我检查了 WHERE computer_id = 30 的语句。结果是所有找到的 report_id 中的第一个 report_id 与最新的 date_entered
    【解决方案3】:

    这是一个非常老的问题,但我是因为同样的问题才来到这里的,所以我把它留在这里是为了帮助其他人。

    我正在尝试优化查询,因为由于数据量大,查询数据库需要 5 多分钟。我的查询类似于接受的答案的查询。 Pablo's comment 把我推向了正确的方向,我的 5 分钟查询变成了 0.016 秒。因此,为了帮助其他查询时间很长的人,请尝试使用uncorrelated subquery

    OP 的示例是:

    SELECT 
        a.report_id, 
        a.computer_id, 
        a.date_entered
    FROM reports AS a
        JOIN (
            SELECT report_id, computer_id, MAX(date_entered) as max_date_entered
            FROM reports
            GROUP BY report_id, computer_id
        ) as b
    WHERE a.report_id = b.report_id
        AND a.computer_id = b.computer_id
        AND a.date_entered = b.max_date_entered
    

    感谢Pablo 的评论。你为我节省了很多时间!

    【讨论】:

      【解决方案4】:

      根据这一点:https://bugs.mysql.com/bug.php?id=54784 转换为 char 应该可以解决问题:

      SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR))
      FROM reports
      GROUP BY report_id, computer_id
      

      【讨论】:

      • 这将为您提供最大日期,但不一定是同一行中的其他值。
      【解决方案5】:

      它对我很有用

      SELECT report_id,computer_id,MAX(date_entered) FROM reports GROUP BY computer_id

      【讨论】:

        【解决方案6】:

        解决方法但有效的解决方案

        只有当 ID 为自增时,才可以搜索最大 id 而不是最大日期。 因此,您可以通过 ID 找到所有其他字段。

        select *
        from table
        where id IN ( 
                      select max(id)
                      from table
                      group by #MY_FIELD#
                      )
        

        【讨论】:

          【解决方案7】:

          非常适合我:

          (SELECT content FROM tblopportunitycomments WHERE opportunityid = 1 ORDER BY dateadded DESC LIMIT 1);
          

          【讨论】:

            【解决方案8】:

            如果您使用当前时间戳,这将非常有效

            SELECT * FROM reports WHERE date_entered = (SELECT max(date_entered) FROM REPORTS)
            

            如果您不使用当前时间戳但您分别使用日期和时间列,这也可以工作

            SELECT * FROM reports WHERE date_entered = (SELECT max(date_entered) FROM REPORTS) ORDER BY time DESC LIMIT 1
            

            【讨论】:

              【解决方案9】:
              select report_id, computer_id, date_entered
              into #latest_date
              from reports a
              where exists(select 'x' from reports 
                              where a.report_id = report_id
                              group by report_id having max(date_entered) =   a.date_entered)
              
              select * from #latest_leave where computer_id = ##
              

              【讨论】:

              • 我已验证
              【解决方案10】:
              SELECT report_id, computer_id, date_entered
              FROM reports
              WHERE date_entered = (
                  SELECT date_entered 
                  FROM reports 
                  ORDER date_entered 
                  DESC LIMIT 1
              )
              

              【讨论】:

              • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
              【解决方案11】:

              在博客引擎上执行此操作以获取最新博客。我已根据您的表结构对其进行了调整。

              SELECT * FROM reports WHERE date_entered = (SELECT max(date_entered) FROM REPORTS)
              

              【讨论】:

                【解决方案12】:

                我使用这个解决方案having max(date_entered),效果很好

                SELECT 
                  report_id, 
                  computer_id, 
                  date_entered
                FROM reports
                GROUP BY computer_id having max(date_entered)
                

                【讨论】:

                • 这对我不起作用,仍然得到第一个值,而不是最大值
                猜你喜欢
                • 2015-09-22
                • 2014-10-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-19
                • 2013-04-02
                • 1970-01-01
                • 2016-11-21
                相关资源
                最近更新 更多