我更愿意为此使用 JOIN,但由于性能影响,没有一个解决方案是可行的,或者它们不会返回正确的结果集。
RunTime
列是每晚午夜捕获的 UNIX 时间戳。并非每个条目都会在每天晚上发生,这意味着 Entry1 的条目可能发生在两天前,但不是今天。
架构:
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(32) NOT NULL,
`Category` int(11) NOT NULL,
`RunTime` int(11) NOT NULL,
UNIQUE KEY `ID` (`ID`),
期望结果示例:
+-------------+----------------+----------+
| Name | LastRunTime | Count |
+-------------+----------------+----------+
| Random Name | 1339131600 | 73 |
| RandomName2 | 1337131600 | 13 |
... etc
基本上,我的工作查询如下所示。它将查询表中昨天的数据。
select Name,
RunTime AS LastRunTime,
count(*) AS Count
from TABLE
where RunTime =
(
select DISTINCT( RunTime ) from TABLE WHERE r.Name=Name order by RunTime LIMIT 1,1
)
and Category in
(
select AnotherTable .ID from AnotherTable where AnotherTable.Status = 1
)
group by Name
问题是,这个查询很慢。我想放弃 RunTime 列上的第一个子查询,但 LIMIT 和关联让我发挥了最大作用。上述过程需要非常、非常、很长的时间。
有没有人有一个方法的例子:
在 RunTime
不一致的情况下快速高效地获取第二个最近的 RunTime
,即第二个最近的 RunTime
的行数跨所有行?
如有任何建议,我们将不胜感激!
最佳答案
Select Name, Max(RunTime ) as LastRunTime ,Count(*) as Count
from TABLE a
Inner join AnotherTable b ON a.Category =b.ID and b.Status = 1
GROUP BY name
Having LastRunTime < Max(RunTime )
关于MySQL 子查询与 LIMIT 与 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834471/