2013-03-23 3 views
1

다른 ID를 가진 종류의 여러 행으로 구성된 테이블이 있습니다. (종류는 많으며 ID는 고유하며 두 열 모두 색인이 생성됩니다.) 이제 각 종류의 ID가 가장 높은 두 가지를 선택해야합니다. 내가하는 일은 다음과 같습니다.MySQL : 가장 높은 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 등) 및

 
+-----------+-----------+ 
| 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 | 
+-----------+-----------+ 
+0

외부 결합에 대한 이유가 없습니다. –

+0

더 빨라지겠습니까? –

+0

샘플 데이터와 예상 결과를 게시 할 수 있습니까? 당신의 임무는 명확하지 않습니다. 성능 (대용량 데이터 세트의 경우)은 종종 테이블 인덱싱에 의존합니다. 어떤 색인이 있습니까? –

답변

1

다음은 꽤 잘 수행 할 수 있습니다 : 당신이 kind, 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 

.

+0

'id> 상수'를 필터링하는 것을 잊지 마십시오. 내부 질의는'select id ... order by id desc limit 1'이 아닌'select max (id) t t2, 여기서 t2.kind = t1.kind와 t2.id kputnam

+0

고든이 대답 해 주셔서 감사합니다. 필자는 그것을 테스트하고 나의 첫 번째 쿼리를 조금이라도 더 좋아하지만 두 번째 쿼리보다 40 % 느립니다. 그러나 좋은 해결책이기 때문에 아플 답장을하십시오. –

+0

@dudelgrincen. . . '(kind, id)'에 대한 색인이 있습니까? 각각에 대한 별도의 인덱스는 아니지만 둘 다에 대한 하나의 인덱스 (순서대로). –

2

만약에 대신 각 종류에 대한 하나의 행으로 튜플을 (종류, ID, ID)를 생산, 당신의 R : 표현의 결과가 다른 경우 여기

는 예를 들어 결과 집합입니다 결정 esult 세트는 (종류, id) 종류 당 2 개의 행이 있습니까? 비록 이것이 자신을 실행하지 않고 더 performant 될 지 모르겠다.

 
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; 

마지막 ORDER BY 절은 당신이 결과를 확인하기 쉽도록, 그래서 성능을 평가할 때 생략하는 단지입니다. 종류의ID가 일 때만 상수를 초과 할 수 있으므로 (종류, ID) 행만 있으면됩니다.

+0

필자는 필자가 원했던 것은 아니지만 필자는 그것을 시도했다. 나는 그것을 사용할 수 있지만 그것은 내 첫번째 시도만큼 빠릅니다. 어쨌든 고마워! :) 당신의 시간 때문에 당신의 대답이 잘못되었습니다. –

+0

예. 나는 indeces가 있습니다. –

관련 문제