【问题标题】:complex'ish SQL joins across multiple tables with multiple conditions across all tables复杂的 SQL 跨多个表连接,所有表具有多个条件
【发布时间】:2011-03-23 11:57:06
【问题描述】:

给定以下表格:

labels              tags_labels  
|id   |name   |     |url   |labelid |  
|-----|-------|     |/a/b  |1       |  
|1    |punk   |     |/a/c  |2       |  
|2    |ska    |     |/a/b  |3       |
|3    |stuff  |     |/a/z  |4       |  

artists             tags  
|id  |name    |     |url   |artistid   |albumid  |  
|----|--------|     |------|-----------|---------|  
|1   |Foobar  |     |/a/b  |1          |2637     |
|2   |Barfoo  |     |/a/z  |2          |23       |  
|3   |Spongebob|    |/a/c  |1          |32       |

我想获取与几个条件匹配的 url 列表(用户可以将其输入到使用这些语句的脚本中)。 例如,用户可能想要列出所有标签为“(1 OR 2) AND 3”的 url,但前提是它们来自艺术家“Spongebob OR What”。

是否可以在使用 inner/harry potter/cross/self JOIN 的单个语句中执行此操作? 或者我是否必须将查询分散到多个语句中并将结果缓冲在我的脚本中?

编辑:
如果可能的话,该声明会是什么样子? :p

【问题讨论】:

    标签: sql join conditional-operator


    【解决方案1】:

    是的,您可以在一个查询中完成此操作。也许一种有效的方法是根据用户输入的条件动态生成 SQL 语句。

    【讨论】:

    • 我的错;应该提到我也在寻找一个查询来统治他们;)
    【解决方案2】:

    此查询将允许您按标签名称或艺术家名称进行过滤。 动态构建 sql 以连接用户参数或 将所需的参数传递给存储过程显然会改变 where 子句,但这实际上取决于您的“脚本”必须有多动态......

    SELECT tl.url
    FROM labels l INNER JOIN tags_labels tl ON l.id = tl.labelid
    WHERE l.name IN ('ska','stuff') 
    UNION (
    SELECT t.url
    FROM artists a INNER JOIN tags t ON a.id = t.artistid
    WHERE a.name LIKE '%foo%'
    )
    

    祝你好运!

    【讨论】:

    • 嗯,谢谢,但这不是我想要的答案。最重要的是,它没有解决创建允许对标签 ID 进行 AND 的列表的问题。在原始表中,没有带有 2 个标签的单个条目...
    • 抱歉,意思是 tags_labels 没有包含 2 个标签 ID 的行。
    • 我不明白“创建一个允许 AND 标签 ID 的列表”。你在说什么?
    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2013-11-09
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    相关资源
    最近更新 更多