在这里潜伏了很长时间,多年来一直在使用这个网站的建议,现在我有一个我找不到答案的问题 - 我相信解决方案很简单!
我正在为音乐曲目建立一个标记系统。我有三张桌子
曲目
---------------
| id | name |
---------------
| 1 | Track1 |
| 2 | Track2 |
---------------
标签链接
--------------------------
| id | tag_id | track_id |
--------------------------
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
--------------------------
标签
-------------------------
| id | tag | type |
-------------------------
| 1 | acoustic | genre |
| 2 | anger | mood |
-------------------------
我希望能够获取具有例如标签:声学,类型:流派和标签:愤怒,类型:情绪的曲目的曲目名称。所以在这种情况下,我想要轨道 1,因为它有两个标签。
我目前的查询是
SELECT tracks.name
FROM tracks
JOIN taglinks ON tracks.id=taglinks.track_id
JOIN tags ON (tags.type='genre' AND tags.tag='acoustic') AND (tags.type='mood' AND tags.tag='anger')
WHERE taglinks.tag_id=tags.id;
这不会返回任何内容,如果我删除第二个 JOIN 中的 AND 部分,那么我会按预期将所有轨道标记为声学,如果我将其更改为 OR,我会再次按预期获得两个轨道。
我如何执行 AND 并仅返回同时具有这些标签和类型的曲目?
先谢谢了
编辑:
只是为了澄清我所追求的。我希望能够检索同时具有 Acoustic 和 Anger 作为标签的曲目,但前提是这些标签也与给定类型匹配。
这是因为稍后我可能有一个名为 jazz 的类型为类型的标签,以及一个名为 jazz 的类型为风格的标签,我需要能够确保我选择了正确的标签类型以及标签本身。
这是我正在使用的 sqlfiddle 的链接 - http://sqlfiddle.com/#!2/aad82/3。
到目前为止,吉尔斯的回答似乎是一个很好的解决方案!