2011-02-04 18 views
0

私は2つのテーブル:UsersFilesを持っています。MySQLの右外部結合

ユーザーテーブルには10行、Filesテーブルには450行のユーザーID(UserID)の列があります。

最後にダウンロードしたすべての人物とファイルのリストを照会します。ファイル表は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 
) 

上記のクエリは、すべてのユーザーとファイルを返します。これに対して正しい質問は何でしょうか?

+0

試しましたか? Users.Name、Files.Nameからユーザーを選択Users.ID = Users.UserID ORDER BY Files.LastDownloadTime DESC制限1) – B4NZ41

答えて

2

あなたがこれを行うことができます:

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

@Frankありがとうございました。 'LIMIT 1'はMySQLで行われているのですか? – alex

+0

サブクエリでLIMITを使用するとMySQLに問題があります。私はさまざまなMySQLのバージョンでこの問題の現在の状態についてよく分かりません。 –

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

"TOP"はMySQLで動作しません –

+0

私は試してみました。このクエリーはただ1人のユーザーとすべてのファイルを表示します:) – atromgame

+0

私はそれを持っています。 –

0

あなたは、JOIN 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);