2015-01-02 5 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 песни (с идентификаторами 0, 1, 2), и у меня есть 5 категорий (рок, поп, рэп и так далее) и соответственно, их идентификаторы (0, 1, 2 ...). Как должен выглядеть мой SQL-запрос, если я хочу выбрать более одной категории, тогда мне нужно посмотреть в таблицу SONGS_CATEGORIES и получить все song_id с идентификатором категории, который я выбрал, а затем получить песни из таблицы SONGS с этими идентификаторами ?

Надеюсь, я объяснил, что мне нужно очень хорошо, английский не мой родной язык.

+1

Использовать синтаксис соединения, возможно, 'in' statement for", если я хочу, чтобы выбрать более одной категории "Это может помочь вам понять, присоединяется: http://blog.codinghorror.com/a-visual-explanation -of-sql-joins/ – xQbert

+0

Я попробовал «JOIN» и застрял, потому что просто не могу представить себе, как это должно выглядеть. –

+0

Вы должны прочитать это [Вопрос и ответ] (http://stackoverflow.com/q/12475850/1450077). Я отправил некоторое время назад. Это действительно длинный учебник только для таких случаев. – Fluffeh

ответ

1

Если вы уже знаете, идентификационные номера категорий, которые вы» желая песни с того времени, следует следующее:

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]); 

В обоих этих примерах вы бы заменить @ с данными вы обеспечиваете и настроить ВЫБЕРИТЕ часть, чтобы показывать только столбцы тебе нужно.

+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'? Но что, если одна и та же песня присутствует в 2 или более категориях, не будет ли тогда sql показывать мне эту песню? –

+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 какие столбцы вы выбираете. повторяется ли вся строка –

Смежные вопросы