1

我有一个表,其中包含具有不同 ID 的多行。(种类很多。ID 是唯一的。两列都已编入索引。)现在我需要选择每种 ID 最高的两个。这就是我所做的。

select max(c.id), max(d.id) from theTable c left join
theTable d on c.id > d.id and c.kind=d.kind
where c.id > constant group by c.kind;

然而,上面的查询表现不佳,这并不令人意外。我想出了一个更快的版本...

select c.id, max(d.id) from (select max(id) id, kind from theTable    
where id > constatnt group by kind) c left join
theTable d on c.id > d.id and c.kind=d.kind group by c.kind;

....但仍然不够快

有没有更有效的方法来达到同样的效果?谢谢!

编辑: theTbale 是一个历史表,所以我的任务是获取每种类型的当前值和以前的值,并将它们作为表达式的一部分(逻辑运算、合并、ifs 等)进行比较,并确定表达式结果是否不同

这是一个示例结果集:

+-----------+------------+
| 最大值(c.id)| 最大值(d.id)|
+-----------+------------+
| 1747 | 空 |
| 1701 | 第1432章
| 1703 | 第1434章
| 1706 | 第1437章
| 1707 | 1438 |
| 1751 | 空 |
| 1713 | 第1444章
| 1750 | 空 |
| 1709 | 1440 |
| 1742 | 1741 |
| 1711 | 第1442章
| 1746 | 1745 |
| 1708 | 第1439章
| 1719 | 1450 |
| 1725 | 第1456章
| 1723 | 第1454章
| 1740 | 1733 |
| 1705 | 第1436章
| 1702 | 第1433章
| 1749 | 1748 |
| 1712 | 第1443章
| 1718 | 第1449章
| 1722 | 第1453章
| 1728 | 第1459章
| 1721 | 第1452章
| 1739 | 1731 |
| 1714 | 第1445章
| 1717 | 第1448章
| 1716 | 第1447章
| 1724 | 第1455章
| 1710 | 第1441章
| 1727 | 第1458章
| 1720 | 第1451章
| 1738 | 空 |
| 1715 | 第1446章
| 1704 | 第1435章
| 1726 | 第1457章
| 1758 | 1757 |
+-----------+------------+
4

2 回答 2

2

如果不是为每种类型生成(kind, id, id)元组,您的结果集是(kind, id)每种类型有两行,该怎么办?不过,我不确定如果不自己运行它是否会更高效。

选择 x.kind, x.id
FROM (SELECT a.kind, a.id
        从表中
        左外连接表 b
          ON a.kind = b.kind
         和 a.id < b.id
       按 a.id 分组
       计数(*) < 2
       由 b.id 订购)x
WHERE x.id > 常量
由 x.kind 订购;

最后一个ORDER BY子句只是为了让您更容易验证结果,因此在评估性能时将其省略。请注意,某些种类可能只有一个id超过您的常量,因此您将只有一个(kind, id)行用于该种类。

于 2013-03-23T22:43:24.800 回答
1

以下可能会表现得很好:

select kind, max(id) as maxid,
       (select id from t t2 where t2.kind = t.kind and t2.id < max(t1.id) order by id desc limit 1) as secondId
from t
group by kind

如果kind, id.

于 2013-03-23T22:55:55.107 回答