2014-12-08 3 views
1

음악 트랙 데이터베이스가 있으며 가장 많은 트랙을 가진 장르를 찾고 있습니다. 장르는 작업 테이블에 저장되며 트랙 테이블의 각 트랙에는 작업이 속한 필드가 있습니다.SQL의 백작에서 최대 값 찾기

이 쿼리는 올바르게 장르를 반환하고 얼마나 많은 트랙들이 각각 가지고 :

SELECT w.genre 
    , COUNT(t.name) [numTracks] 
    FROM Track t 
    LEFT 
    JOIN Work w 
    ON t.workName = w.name 
    LEFT 
    JOIN AlbumContains ta 
    ON ta.workName = t.workName 
GROUP 
    BY w.genre 

하지만 난 그냥 어느 장르 (또는 여러 장르를) 취할 수있는 방법을 찾을 수없는 결과에서 가장 높은 numTracks있다 . 사전에

감사합니다!

+0

태그에 언급 된 mysql, sql @Strawberry –

+0

@Strawberry MS SQL Server이지만 태그가 어떻게 추가되었는지 잘 모르겠습니다. – cogm

+0

M $ SQL은 TOP를 사용하지만 사용하지 않는다고 저는 믿습니다. – Strawberry

답변

1

이 시도 :

MySQL의

SELECT w.genre, COUNT(t.name) AS numTracks 
FROM work w 
LEFT JOIN Track t ON t.workName = w.name 
GROUP BY w.genre 
ORDER BY COUNT(t.name) DESC 
LIMIT 1 

SQL 서버에

SELECT TOP 1 w.genre, COUNT(t.name) AS numTracks 
FROM work w 
LEFT JOIN Track t ON t.workName = w.name 
GROUP BY w.genre 
ORDER BY COUNT(t.name) DESC 
+0

그건 단지 장르 목록을 반환하고 각 트랙의 개수는 얼마입니까 – cogm

+0

가장 많은 장르가있는 장르 (또는 장르)를 찾으려고합니다. – cogm

+0

"LIMIT 근처에서 구문이 잘못되었습니다." 그 오류. 그리고 가장 많은 트랙을 가진 모든 장르를 되돌려 주겠습니까? – cogm

0
select * from (SELECT Work.genre, count(Track.name) as numTracks FROM Track LEFT JOIN Work ON Track.workName=Work.name LEFT JOIN AlbumContains ON Track.workName=AlbumContains.workName GROUP BY Work.genre)alias order by aias. numTracks desc limit 1 
0

나는 당신의 문제가 정확히하지만, 어떻게 든 비슷한이 문제에 대한 생각 : SQL Select only rows with Max Value on a Column

대부분의 트랙과 함께 모든 장르를 갖고 싶으면 (내가 이해할 수있는 한 원하는대로, 원하는 내용을 원한다면) 다시 쿼리에 참여해야 할 수도 있습니다.

SELECT Work.genre, count(Track.name) as numTracks 
    FROM Track 
    LEFT JOIN Work ON Track.workName=Work.name 
    GROUP BY Work.genre 
    HAVING count(Track.name) = 
    (SELECT TOP(1) count(Track.name) as numTracks2 
    FROM Track 
    LEFT JOIN Work ON Track.workName=Work.name 
    GROUP BY Work.genre 
    ORDER BY numTracks2 DESC 
); 

이 오히려 어색하게 보이지만, 아마도 서버는 하위 쿼리를 최적화 : MS SQL에

SELECT Work.genre, count(Track.name) as numTracks 
    FROM Track 
    LEFT JOIN Work ON Track.workName=Work.name 
    GROUP BY Work.genre 
    HAVING numTracks= 
    (SELECT count(Track.name) as numTracks 
    FROM Track 
    LEFT JOIN Work ON Track.workName=Work.name 
    GROUP BY Work.genre 
    ORDER BY numTracks DESC 
    LIMIT 1); 

또는이 :이 (MySQL의) 같은 부속 선택. 그러나 성능이 우수한 솔루션의 경우 커서 대신 사용할 수도 있습니다.