2017-08-28 20 views
1

複雑な検索を行うSQL SELECTコマンドをフォーマットする方法を理解しようとしています複雑な検索のSQL構文

私は2つのテーブルを持つデータベースを持っています。

ファイル
がFILEID
ファイルパス

パラメータ
ParameterNameが
ParamaterValue
FILEID

目標は、複数の値のパラメータを検索することですし、その後にのみ、その人のためFileIDsを返しますすべての値を持っています。

これらはメディアファイルなので、パラメータはフォーマット、ビデオ幅、オーディオコーデックなどです。これらのフィールドを必要なだけ多く選択してから、すべてのパラメータに一致します。

たとえば、MKVの形式、AVCのVideoCodec、およびAACのAudioCodecを持つすべてのファイルを選択したいとします。

私はそれを行う方法を理解できません。私は左の結合を行う場合、私は1つのパラメータで動作するようにすることができますが、秒を追加するとすぐに失敗します。私はネストされた結合を使用する必要があると仮定しますが、それを行う方法を正確に理解するためにはSQLで十分ではありません。

これは問題がある場合、SQLite3を使用しているローカルのC++アプリケーションです。これを行うための

答えて

1

あなたは使用することができます動作するようには思えないが、私は私が実際に一致するファイルのためのファイルパスを取得するファイルのテーブルにどのようにリンクしているんIN

SELECT * 
FROM file 
WHERE fileid IN (SELECT fileid FROM parameters WHERE name = 'name1' and value = 'value1') AND 
     fileid IN (SELECT fileid FROM parameters WHERE name = 'name2' and value = 'value2') AND 
     fileid IN (SELECT fileid FROM parameters WHERE name = 'name3' and value = 'value3') 
+0

私は上記のグループメソッドからいくつかの奇妙な結果があったので、代わりにこのメソッドを使用しました。 – Dan

2

一つの方法は、group byhavingを使用しています:

select fileid 
from parameters p 
where (name = 'name1' and value = 'value1') or 
     (name = 'name2' and value = 'value2') or 
     (name = 'name3' and value = 'value3') 
group by fileid 
having count(distinct name) = 3; 

「3」は、あなたが探している異なるパラメータの数です。

+0

?私は左結合を使ってみましたが動作しませんでした – Dan

+0

'SSS'がGordonのクエリで、' select *ファイルから(SSS)内のfileidが 'ジョブを行う場合 –

+0

これは完璧に動作します!ありがとう – Dan

関連する問題