复杂搜索的SQL语法

时间:2017-08-28 05:30:12

标签: sql sqlite relational-division

我试图找出如何格式化将执行复杂搜索的SQL SELECT命令

我有一个包含两个表格的数据库。

文件

写到FileID FilePath

参数
参数名称
ParamaterValue
写到FileID

目标是搜索多个值的参数,然后仅为具有所有值的那些返回FileID。

这些是媒体文件,因此参数包括格式,视频宽度,音频编解码器等...我希望用户能够根据需要选择这些字段,然后让它返回匹配的文件所有参数。

例如,我想选择所有格式为MKV的文件,AVC的VideoCodec和AAC的AudioCodec。

我无法弄清楚如何做到这一点。如果我进行左连接,我可以使用一个参数,但只要添加一个参数就会失败。我假设我需要使用嵌套连接,但我对SQL不够好,无法弄清楚如何做到这一点。

如果重要的话,这是一个使用SQLite3的本地C ++应用程序。

2 个答案:

答案 0 :(得分: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”是您要查找的不同参数的数量。

答案 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')