MySQL 子查询与 LIMIT 与 JOIN
Posted
技术标签:
【中文标题】MySQL 子查询与 LIMIT 与 JOIN【英文标题】:MySQL Subquery With LIMIT vs JOIN 【发布时间】:2012-08-06 19:17:38 【问题描述】:我更愿意为此使用 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
列上的第一个子查询移开,但是限制和关联对我来说是最好的。以上需要非常、非常、很长时间。
有没有人举例说明以下方法:
在RunTime
在所有行中不一致的情况下,快速有效地获取第二个最近的RunTime
、第二个最近的RunTime
的行数?
欢迎提出任何建议!
【问题讨论】:
您的索引是什么样的?前面带有EXPLAIN
的查询和子查询运行的结果是什么。
【参考方案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 )
【讨论】:
你为什么要两次MAX(RunTime)
?在您的Having
中,您可以说HAVING RunTime < LastRunTime
@arnoudhgz,你需要 MAX()
,因为它只能与某种比较函数一起使用,否则你应该只使用 where。
现在,在您上次编辑时,查询无法获得结果。你现在是说只有比自己小的东西的结果才能在结果中......(LastRuntime
是相同的MAX(RunTime)
,所以LastRunTim < MAX(RunTime)
会给你 0 个结果)
@sixeightzero LastRunTime
不是表格列。 HAVING RunTime < LastRunTime
应该可以解决这个查询
@arnoudhgz,我在使用运行时时找不到列。如果我通过 LastRunTime,则有工作,但它会提取不是当前运行时的所有记录。【参考方案2】:
我坚持使用子查询,但将时间范围更改为 WHERE RunTime = (SELECT MAX(RunTime) - 86400...
。
要求太高或太复杂的所有其他解决方案或尝试。
【讨论】:
以上是关于MySQL 子查询与 LIMIT 与 JOIN的主要内容,如果未能解决你的问题,请参考以下文章