2017-08-28 120 views
1

我想弄清楚如何格式化一個SQL SELECT命令,將執行復雜的搜索複雜搜索的SQL語法

我有一個數據庫有兩個表。

文件
FILEID
文件路徑

參數
參數名稱
ParamaterValue
寫到FileID

的目標是搜索參數的多個值,然後只返回FileIDs對於那些擁有所有的價值。

這些是媒體文件,所以參數是像格式,視頻寬度,音頻編解碼器等東西...我希望用戶能夠選擇儘可能多的這些字段,然後讓它返回文件匹配所有的參數。

因此,例如我想選擇所有格式爲MKV,AVC的VideoCodec和AAC的AudioCodec的文件。

我不知道該怎麼做。如果我做一個左連接,我可以讓它與一個參數一起工作,但只要加一秒就失敗了。我假設我需要使用嵌套連接,但我不夠好用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

@dan如果'SSS'是戈登的查詢,然後'從文件中選擇*從哪裏(SSS)fileid將完成這項工作 –

+0

這是完美的!謝謝 – Dan