문제

아래의 "기사"라는 MySQL 테이블을 살펴보십시오.

+----+-----------+---------+------------------------+--------------------------+
| id | articleId | version | title                  | content                  |
+----+-----------+---------+------------------------+--------------------------+
|  1 |         1 | 0.0     | ArticleNo.1 title v0.0 | ArticleNo.1 content v0.0 |
|  2 |         1 | 1.0     | ArticleNo.1 title v1.0 | ArticleNo.1 content v1.0 |
|  3 |         1 | 1.5     | ArticleNo.1 title v1.5 | ArticleNo.1 content v1.5 |
|  4 |         1 | 2.0     | ArticleNo.1 title v2.0 | ArticleNo.1 content v2.0 |
|  5 |         2 | 1.0     | ArticleNo.2 title v1.0 | ArticleNo.2 content v1.0 |
|  6 |         2 | 2.0     | ArticleNo.2 title v2.0 | ArticleNo.2 content v2.0 |
+----+-----------+---------+------------------------+--------------------------+

나는 articles.id에서 articles.id가 최대 숫자 인 경우 articles.id를 반환하기 위해 쿼리를 생각해 내려고합니다.

실제 기사 테이블에는 10,000 개가 넘는 항목이 포함되어 있습니다.

따라서이 예에서는 articles.id 4와 6 만 반환하기를 원합니다. 나는 키워드를 구별하고 max ()를 기능하지만 그것을 못 박는 것처럼 보일 수 없습니다.

모든 제안에 감사드립니다 ...

도움이 되었습니까?

해결책

여기에는 하위 쿼리가 필요합니다.

SELECT a.id, a.version
FROM articles a
WHERE a.version = (
    SELECT MAX(version)
    FROM articles b
    WHERE b.articleId = a.articleId
)

다른 팁

로부터 MySQL 매뉴얼, 이것은 트릭을 수행합니다.

SELECT a1.id
FROM Articles a1
LEFT JOIN Articles a2 ON a1.articleId = a2.articleId AND a1.version < a2.version
WHERE a2.articleId IS NULL;

링크 된 매뉴얼에서 :

그만큼 LEFT JOIN 언제에 따라 작동합니다 s1.price a1.version 그것에 있습니다 최고 최저한의 가치가 있습니다 s2.price a2.version a 보다 큰 보다 작은 값과 해당 s2.article a2.articleId 가치는입니다 NULL.

(나는 그들의 텍스트를 당신의 상황과 일치시키기 위해 편집했다.)

여기에서 하위 쿼리를 사용할 수 있습니다.

select
    a.id
from
    articles a
where
    a.version = (select max(version) from articles)

이것은 상관 관계가있는 서브 쿼리가 아니기 때문에 (조인보다 빠르거나 빠르게) 매우 빠르므로 걱정할 필요가 없습니다. 그러나 최대가있는 모든 값을 반환합니다. articleid.

물론, 나는 당신이 색인을 던지는 것이 좋습니다 articleid (가정 id 이미 클러스터되어 있습니다). 그것은 더 빨리 돌아 오는 데 도움이 될 것입니다.

주석에 언급 된 바와 같이, 각각의 최대 버전을 얻으려면 articleid, 다음을 수행 할 수 있습니다.

select
    a.id
from
    articles a
    inner join (select articleid, max(version) 
                from articles group by articleid) as b on
        a.articleid = b.articleid
        and a.version = b.version

이것은 해당 하위 쿼리에서 결합을 생성하며 일반적으로 각각의 최대를 선택하는 상관 관계 서브 쿼리보다 훨씬 빠릅니다. articleid.

SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)

아마도 :

articleId에서 articles from articles in at article in (articles in articles in at articles in article in article)

넌 할 수있어

SELECT articles.id
  FROM articles a
 WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)

MySQL이 수행 할 것이라는 것을 모르겠지만 Oracle과 SQL Server는 괜찮습니다.

위의 모든 답변은 DJDonal3000의 명시된 문제를 해결할 수 있습니다. 그러나 대부분은 응용 프로그램의 성능을 방해하는 상관 관계 서브 쿼리입니다. 클라우드 애플리케이션을 사용하는 경우 위의 쿼리를 사용하지 않는 것이 좋습니다. 가장 좋은 방법은 A와 B의 두 테이블을 유지하는 것입니다. 문제는 테이블에 더 많은 업데이트 및 삽입이있을 것이지만 표 A에서 그룹을 수행하고 최대를 수행하면 비용이 많이 드는 비용이 드는 경우 테이블에 더 많은 업데이트 및 삽입이 표시되지만 페치는 더 빠르게 진행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top