MySQL에서 최대 ID 값으로 행을 찾으십시오
-
19-09-2019 - |
문제
아래의 "기사"라는 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에서 그룹을 수행하고 최대를 수행하면 비용이 많이 드는 비용이 드는 경우 테이블에 더 많은 업데이트 및 삽입이 표시되지만 페치는 더 빠르게 진행됩니다.