我试图找出如何格式化将执行复杂搜索的SQL SELECT命令
我有一个包含两个表格的数据库。
文件
写到FileID
FilePath
参数
参数名称
ParamaterValue
写到FileID
目标是搜索多个值的参数,然后仅为具有所有值的那些返回FileID。
这些是媒体文件,因此参数包括格式,视频宽度,音频编解码器等...我希望用户能够根据需要选择这些字段,然后让它返回匹配的文件所有参数。
例如,我想选择所有格式为MKV的文件,AVC的VideoCodec和AAC的AudioCodec。
我无法弄清楚如何做到这一点。如果我进行左连接,我可以使用一个参数,但只要添加一个参数就会失败。我假设我需要使用嵌套连接,但我对SQL不够好,无法弄清楚如何做到这一点。
如果重要的话,这是一个使用SQLite3的本地C ++应用程序。
答案 0 :(得分:2)
执行此操作的一种方法是使用group by
和having
:
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”是您要查找的不同参数的数量。
答案 1 :(得分: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')