【问题标题】:SQL syntax for complex search复杂搜索的 SQL 语法
【发布时间】:2018-02-05 07:47:32
【问题描述】:

我正在尝试弄清楚如何格式化将执行复杂搜索的 SQL SELECT 命令

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

文件
文件ID
文件路径

参数
参数名称
参数值
文件ID

目标是在参数中搜索多个值,然后仅返回具有所有值的文件 ID。

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

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

我不知道该怎么做。如果我进行左连接,我可以让它与一个参数一起工作,但只要添加一个参数,它就会失败。我假设我需要使用嵌套连接,但我对 SQL 还不够好,无法弄清楚如何做到这一点。

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

【问题讨论】:

    标签: sql sqlite relational-division


    【解决方案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')
    

    【讨论】:

    • 我从上面的 group 方法得到了一些奇怪的结果,所以我最终改用了这个方法。
    【解决方案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”是您要查找的不同参数的数量。

    【讨论】:

    • 这似乎有效,但我如何将它链接到文件表中,以便我真正获得匹配文件的文件路径?我尝试使用 Left Join 但它不起作用
    • @dan 如果 SSS 是 Gordon 的查询,那么 select * from file where fileid in (SSS) 将完成这项工作
    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2021-08-24
    • 2020-01-18
    相关资源
    最近更新 更多