2011-02-04 7 views
0

두 테이블 : UsersFiles이 있습니다.MySQL의 오른쪽 외부 조인

사용자 테이블에는 10 개의 행이 있고 파일 테이블에는 사용자 ID (UserID)의 열이있는 450 개의 행이 있습니다.

마지막으로 다운로드 한 모든 사람과 파일의 목록을 쿼리하고 싶습니다. 파일 테이블의 유형은 DateTimeLastDownloadTime 필드입니다.

이것은 내 SQL 쿼리입니다.

Select 
    Users.Name , Files.Name 
FROM Users 
RIGHT OUTER JOIN Files on Users.ID = (
    Select Files.UserID 
    FROM Files 
    ORDER BY LastDownloadTime DESC Limit 1 
) 

위의 쿼리는 모든 사용자와 파일을 반환합니다. 이것에 대한 올바른 질문은 무엇이되어야합니까?

SELECT Users.Name , Files.Name 
    FROM Users 
    RIGHT OUTER JOIN 
    (SELECT Files.Name 
     FROM Files 
     INNER JOIN 
      (SELECT TOP 1 Files.UserID ,Max(LastDownloadTime) as LastDownloadTime 
        FROM Files 
        ORDER BY LastDownloadTime DESC,Files.UserID ) as f2 
    ON Files.UserID = f2.UserID AND Files.LastDownloadTime = f2.LastDownloadTime 
    ) as f ON Users.ID = f.UserID 
+0

시도해 보셨습니까? Users.Name, Files.Name에서 사용자를 선택합니다. 오른쪽 외부 조인 Users.ID = Users.UserID ORDER BY Files.LastDownloadTime DESC 제한 1) – B4NZ41

답변

2

당신은이 작업을 수행 할 수 있습니다 :

+0

"TOP"는 MySQL에서 작동하지 않습니다 –

+0

@ 프랭크 덕분에, 그것을 놓쳤습니다. 'LIMIT 1'은 MySQL에서 수행되는 방식입니까? – alex

+0

하지만 MySQL에 하위 쿼리에서 LIMIT를 사용하는 데 문제가 있습니다. 다른 MySQL 버전에서이 문제의 현재 상태에 대해 확신하지 못합니다. –

1

다음 참조

Select 
    u.Name, 
    (Select f.Name from Files f where u.ID = f.ID order by LastDownloadDate LIMIT 1) 
FROM Users u 
+0

"TOP"는 MySQL에서 작동하지 않습니다. –

+0

나는 이 쿼리는 지금 단 하나의 사용자와 모든 파일을 보여줍니다 :) – atromgame

+0

나는 그것을 가지고 changet :) –

0

가 RIGHT 가입에 대해 확실한가요? 귀하의 질문이 다르게 보입니다.

Select 
    Users.Name 
    ,f2.Name 
FROM 
    Users 
     JOIN (SELECT userid, MAX(lastdownloadtime) AS latest FROM Files GROUP BY userid) f1 ON f1.userid = Users.id 
     JOIN Files f2 ON (Users.ID = f2.userid AND f2.lastdownloadtime = f1.latest);