2016-08-19 11 views
0

テーブル交差点を持つ2つのテーブルからnullでない場合を除き、最大値を選択します。SQLクエリ

Files 
------------------- 
id | revision 
------------------- 
1 | 0 
1 | 1 
1 | 2 
2 | 0 
2 | 1 

Folders 
----------------- 
id | name 
----------------- 
1 | FooBar 

Shares 
-------------------------------- 
id | folderId | fileId | fileRev 
-------------------------------- 
1 |  1 | 1 | null 
2 |  1 | 2 | 0 

出力、私は期待してい:

fileId | revision 
------------------ 
1  |  2 
2  |  0 

を私はに基づいて情報を取ることができるようにしたいですファイルのリビジョンがNULLの場合は、最も高いリビジョンのファイルのレコードを返します。 fileRevがnullでない場合、そのリビジョンに対応するファイルレコードを返します。

私はそうのようにそれを複製することができました:私はより最適化されたクエリでこれを行うことができますどのように

SELECT f.id, max(f.rev) as rev 
FROM files f 
INNER JOIN shares s ON s.fileId = f.id 
WHERE s.fileRev IS NULL AND s.folderId = 1 
GROUP BY f.id 
UNION 
SELECT f.id, f.rev as rev 
FROM files f 
INNER JOIN shares s ON s.fileId = f.id AND f.rev = s.fileRev 
WHERE s.fileRev IS NOT NULL AND s.folderId = 1 

?おそらく組合なし?

+0

を返している場合、それはsqlfiddle(http://sqlfiddle.com/)を追加するのはとても便利です人々はデータを利用して自分自身で試すことができます。 – Jester

答えて

1

私はこれがうまくいくはずだと思います。

IFNULLはどちらかを返しshares.fileRevそれがnullではない場合、それはそれがより良い回答についてはfiles.rev

SELECT files.id, 
     MAX(IFNULL(shares.fileRev, files.rev)) as rev 
FROM files 
JOIN shares ON shares.fileId = files.id 
WHERE shares.folderId = 1 
GROUP BY files.id 
+0

ええと、これは本当に近いです。 Sharesテーブルにヌルリビジョンのファイルを戻すだけです。 – Nick

+0

@Nick、修正済み 'files.id'でグループ化するのを忘れました。それ以外の場合は、すべてのバージョンの中で最大値をとります。たぶん、あなたは現時点で無意味であると思われる場所を削除することもできますか?私は完全な文脈を持っていません。 もう一度試してみてください。私は自分の答えを編集しました。 – Jester

+0

ここで重要なのは、フォルダ内のすべてのファイル共有を検索しようとしているからです。しかし、これは私に私が望む結果を与えているようです。私の質問よりずっと簡単です。ありがとうございました。 – Nick