2017-01-28 1 views
0

그래서 여기 있습니다. 내가 3 개 테이블이 있습니다 노래 (제목, 아티스트, 장르) 플레이리스트를 (이름, 사용자 이름, UserCity) 구성 (PlaylistName, SongTitle) 다음 참조로중첩 SQL 쿼리 확인

: PlaylistName -> 이름 SongTitle -> 제목

문제는 다음과 같습니다. 재생 목록에 REM으로 작성된 노래가 가장 많은 사용자의 이름과 UserName을 찾습니다.

그리고 지금은 내 솔루션이 합법적 인 경우 묻고 싶다 :

UPDATE :이 작업을 수행하여 더 깨끗한 방법을 발견했습니다 :

Select Name, UserName 
    From (Select Name, UserName, Max(cnt) 
      From (Select Name, UserName, count(*) as cnt 
       From PlayList, Composition, Song 
       Where Name = PlaylistName and SongTitle = Title 
       and Artist = 'REM' 


       Group by Name 
       )sub 
      )su; 
+0

희망적인 내용은 도움이되는 설명입니다. select 문은 코드에서와 같이 형식을 지정해야합니다. 질문을 편집하고 Select 문을 강조 표시 한 다음 편집 창의 맨 위에있는 '{}'버튼을 누르십시오. 이렇게하면 질문을 읽기가 쉬워지고 더 많은 반응을 얻게 될 것입니다. –

+0

대단히 감사합니다. 나는 내 전화에서 편지를 쓰고 있는데 그걸 찾고 있었다. 정말 고맙습니다! – FrogFlex

+0

'Where Name = (Any Select PlaylistName' - >>'어디에서 Name = Any (처음에는 PlaylistName을 선택하십시오.) (EXISTS (..) 또는 IN()도 깨끗합니다, IMHO) – wildplasser

답변

0

사용 join들!

select pl.username, count(*) as num_REM 
from playlist pl join 
    composition c 
    on c.playlistname = p.name join 
    song s 
    on pl.songtitle = s.title 
where s.artist = 'REM' 
group by pl.username 
order by count(*) desc; 

limit을 사용하면 가장 많은 노래를 가진 사용자를 확보 할 수 있습니다.

모든 사용자가 가장 적합한 방법은 TOP WITH TIES (SQL Server 및 Sybase), TOP (MS Access), 창 기능 (거의 모든 데이터베이스), 변수 (MySQL) 또는 복잡한 하위 쿼리 MySQL, SQLite). 이 부분은 데이터베이스 의존도가 높습니다.

+0

u 응답 주셔서 감사합니다.이 2 명의 사용자가 제한된 동일한 숫자가있는 경우 올바른 것처럼 보이지만 내 쿼리가 올바른지 의미합니다. – FrogFlex

+0

@FrogFlex. (MySQL에서는) 하나의 행을 리턴하거나 구문 오류로 실패합니다. 따라서 개선되지는 않을 것이라고 생각합니다. –

+0

그래서 키워드를 모두 사용합니다. 다중 리턴을 가능하게합니다. – FrogFlex