如何按 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 日期选择