任何人都可以帮我解释这个陈述吗?
我有三个表,tracks
,tags
和数据透视表tag_track
。
tags
包含音乐类别和音乐节奏限制,以每分钟节拍(bpm)为单位。
tracks
包含所有包含标题,艺术家等字段的曲目。
tag_track
是tag_id
和track_id
的支点。
在本声明中,我想获取tracks
表的所有列,这些列在tag_track
- 表中有特定类别的记录。 F.ex. id=1
的音乐用于运行。然后我想在相应的bpm范围内获得所有跑道。
所以我写了一下查询:
SELECT * FROM tracks A
INNER JOIN tag_track B ON A.id=B.track_id AND B.tag_id=1
INNER JOIN tags C ON A.bpm >= C.bpm_min AND A.bpm <= C.bpm_max
ORDER BY A.bpm ASC
哪个适合运行,有id=1
。但是一旦我更改为id=2
,由于某种原因,运行(id=1
)的bpm约束仍然有效,然后不返回任何曲目。
问题出在第三行,
INNER JOIN tags C ON A.bpm >= C.bpm_min AND A.bpm <= C.bpm_max
如何使此行对正确的B.tag_id
或C.id
采用bpm约束?
答案 0 :(得分:0)
如果B.tag_id
应该等于C.id
,那么您可以将其包含在联接中,如下所示:
SELECT A.*
FROM tracks A
INNER JOIN tag_track B ON A.id=B.track_id AND B.tag_id=1
INNER JOIN tags C ON A.bpm >= C.bpm_min AND A.bpm <= C.bpm_max AND B.tag_id = C.id
ORDER BY A.bpm ASC;
答案 1 :(得分:0)
以另一种方式修复......
SELECT * FROM tracks A
INNER JOIN tag_track B ON A.id=B.track_id AND B.tag_id=1
WHERE A.bpm > (insert bpm min here) AND A.bpm < (insert bpm max here)
ORDER BY A.bpm ASC
这很有效。