如何按 MAX(日期)选择?

Posted

技术标签:

【中文标题】如何按 MAX(日期)选择?【英文标题】:How to SELECT by MAX(date)? 【发布时间】: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,但我不知道该怎么做。

【问题讨论】:

【参考方案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)

【讨论】:

这对我不起作用,仍然得到第一个值,而不是最大值

以上是关于如何按 MAX(日期)选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CI Active Record 中按 MAX 日期选择

mySQL如何从没有组的重复值中选择MAX(日期)[重复]

如何按期间间隔选择/排序日期?

如何加入表格并按最大日期选择 [重复]

如何在 PostgreSQL 中按类别选择具有最大日期组的 id?

如何在不使用窗口函数的情况下在大查询中选择 max(date)?