complex'ish SQL跨多个表连接,所有表中都有多个条件

时间:2010-07-30 22:41:40

标签: sql join conditional-operator

鉴于以下表格:

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”的网址,但仅限于艺术家“Spongebob OR Whatever”。

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

编辑:
如果有可能,声明会是什么样子? :P

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

此查询允许您按标签名称或艺术家名称进行过滤。 动态构建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%'
)

祝你好运!

相关问题