我更倾向于使用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
在所有行中不一致?
任何建议都表示赞赏!
答案 0 :(得分:1)
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 )
答案 1 :(得分:0)
我坚持使用子查询,但将时间范围更改为WHERE RunTime = (SELECT MAX(RunTime) - 86400...
。
所有其他解决方案或尝试过于苛刻或错综复杂的情况。