MySQL 子查询与 LIMIT 与 JOIN

标签 mysql query-optimization subquery percona xtradb

我更愿意为此使用 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/

相关文章:

optimization - 为什么我的查询不使用该索引?

php - 用于连接包含多行的多个表的 SQL 查询 - 正确的方法?

mysql简单子(monad)查询问题

MYSQL:计算具有相同日期的行

php - 在 PDO 事务中创建表

MySQL插入多行缺少一些值

azure - Azure 认知搜索的准确性指标

mySQL,需要帮助将许多子查询转换为 1 个 SELECT 查询(显示 13 列)

mysql - SQL查询结果结构

mysql - 不同的结果jsp mysql