INNER JOIN的SQL语句

时间:2014-05-05 15:39:21

标签: mysql sql

任何人都可以帮我解释这个陈述吗? 我有三个表,trackstags和数据透视表tag_track

tags包含音乐类别和音乐节奏限制,以每分钟节拍(bpm)为单位。 tracks包含所有包含标题,艺术家等字段的曲目。 tag_tracktag_idtrack_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_idC.id采用bpm约束?

2 个答案:

答案 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

这很有效。