2015-01-02 37 views
-1

比方说,我有3个表:如何从mysql过滤我的数据?

table:  SONGS 
cell:  ID   primary key 
cell:  TITLE 
cell:  ADD_TIME 

table:  CATEGORIES 
cell:  ID   primary key 
cell:  title 

table:  SONGS_CATEGORIES 
cell:  ID   primary key 
cell:  SONG_ID 
cell:  CATEGORY_ID 

然后让我们假设我有3首歌曲(有ID的0,1,2),我有5个类别(摇滚,流行,说唱等)和分别是他们的id(0,1,2 ...)。我的sql查询应该是什么样子,如果我想能够选择多个类别,那么我需要查看表SONGS_CATEGORIES并获取所有具有我选择的类别id的songs_id,然后从表SONGS中获得具有这些id的歌曲?

希望我解释了我需要的很好,英语不是我的母语。

+1

使用连接语法,可能是'in'语句中的“如果我希望能够选择多个类别”这可以帮助您了解连接:http://blog.codinghorror.com/a-visual-explanation -of-sql-joins/ – xQbert

+0

我尝试过一个'JOIN',因为我无法想象我的脑中应该是这样。 –

+0

您应该阅读此[问题与答案](http://stackoverflow.com/q/12475850/1450077)我发布了一段时间。这是一个非常长的教程,只为这样的实例。 – Fluffeh

回答

1

如果你已经知道类别的ID号,你”重新想从下面的歌曲应该做的伎俩:

SELECT * 
FROM SONGS s 
    JOIN SONGS_CATEGORIES sc 
     ON s.ID = sc.SONG_ID 
WHERE sc.CATEGORY_ID IN (@id1, @id2, @[email protected]); 

如果你只知道你想要的歌曲类别的名字,那么你可以使用这个:

SELECT * 
FROM SONGS s 
    JOIN SONGS_CATEGORIES sc 
     ON s.ID = sc.SONG_ID 
    JOIN CATEGORIES c 
     ON sc.CATEGORY_ID = c.ID 
WHERE c.title IN (@catTitle1, @catTitle2, @[email protected]); 

在这两个例子中,你会用您所提供的数据@和调整SELECT部分​​,只显示列你需要。

+0

这对我来说很好,它看起来很干净,但我仍然获得了超过一次的相同结果。 –

+0

这个想法看起来很好,与GROUP BY? 'SELECT * FROM songs s JOIN s_in_tag sc ON s.id = sc.song_id WHERE sc.tag_id IN(2,3)GROUP BY(s.id)' –

+0

按SONGS.ID分组会清理事情,如果您有歌曲与您在where子句中的多个类别有关。 –

1

如果你想从第1类中选择歌曲& 2:

SELECT s.id song_id, s.title song_title, s.add_time song_add_time, c.id cat_id, c.title cat_title 
FROM CATEGORIES c 
INNER JOIN SONGS_CATEGORIES sg 
ON c.id = sg.category_id 
INNER JOIN SONGS s 
ON sg.song_id = s.id 
WHERE c.id = 1 OR c.id = 2 
+0

那么'OR'表达式就够了吗?但是,如果同一首歌曲出现在两个或更多类别中,那么不会再向我显示两次那首歌曲吗? –

+0

尝试DISTINCT(s.id)..不知道它的工作原理,但无论如何尝试 – Corentin

+0

'DISTINCT'不工作,我仍然得到同一首歌两次。 –

1

我想这是你所需要的

SELECT * -- select what ever columns you need to display 
FROM SONGS s 
     JOIN SONGS_CATEGORIES sc 
     ON s.ID = sc.SONG_ID 
     JOIN CATEGORIES c 
     ON c.ID = sc.CATEGORY_ID 
where c.title in ('title1','title2') 
+0

它的工作,但我得到同样的结果不止一次。 –

+0

@RaduDascălu您正在选择哪些列。整个行是否重复 –