MySQL:选择具有最高ID的所有两个
我有一个表,它由具有不同ID的多行组成。种类很多。ID是唯一的。这两列都编制了索引。 现在我需要选择每种ID最高的两个。 这就是我要做的MySQL:选择具有最高ID的所有两个,mysql,sql,max,greatest-n-per-group,Mysql,Sql,Max,Greatest N Per Group,我有一个表,它由具有不同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 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;
。。。。但它仍然不够快
有没有更有效的方法达到同样的效果?
谢谢
编辑:
Tale是一个历史记录表,因此我的任务是获取每种类型的当前值和以前的值,并将它们作为表达式逻辑运算、合并、ifs等的一部分进行比较,确定表达式结果是否不同
下面是一个示例结果集:
+-----------+-----------+
| max(c.id) | max(d.id) |
+-----------+-----------+
| 1747 | NULL |
| 1701 | 1432 |
| 1703 | 1434 |
| 1706 | 1437 |
| 1707 | 1438 |
| 1751 | NULL |
| 1713 | 1444 |
| 1750 | NULL |
| 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 | NULL |
| 1715 | 1446 |
| 1704 | 1435 |
| 1726 | 1457 |
| 1758 | 1757 |
+-----------+-----------+
如果结果集不是为每种类型生成一行的kind,id,id元组,而是为kind,id,每种类型生成两行呢?不过,如果不亲自运行,我不确定这是否会更有效 SELECT x.kind, x.id FROM (SELECT a.kind, a.id FROM theTable a LEFT OUTER JOIN theTable b ON a.kind = b.kind AND a.id < b.id GROUP BY a.id HAVING COUNT(*) < 2 ORDER BY b.id) x WHERE x.id > constant ORDER BY x.kind;
最后一个ORDERBY子句只是为了让您更容易验证结果,所以在评估性能时可以忽略它。请注意,某些种类可能只有一个id超过常量,因此该种类只能有一个种类id行。以下内容可能会执行得很好:
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
如果您有一个关于种类id的索引,这将很好地工作。我认为没有理由进行外部连接。您可以发布示例数据和预期结果吗?你的任务不是很清楚。特别是对于大型数据集,性能通常取决于表索引。你有什么索引?外部连接是必需的,因为不是每种类型都有两个超过常量的id值。除非您打算排除没有第二大id的种类,否则您需要一个外部联接。尽管它不是我想要的,但我已经尝试过了。我可以用它,但它和我第一次尝试一样快。无论如何,谢谢!:由于时间关系,我会投票支持你的答案。别忘了按id>常量过滤。内部查询可以重新格式化为selectmaxidt2,其中t2.kind=t1.kind,t2.id