Как сделать запрос соединения для mysql

#mysql #join

#mysql #Присоединиться

Вопрос:

У меня есть 2 таблицы, одна (назовем ее «дорожки») будет содержать информацию о музыкальной дорожке, такую как название, время, файл образца, цена и все необходимое. Вторая таблица (назовем ее «категории») будет иметь идентификатор трека из первой таблицы, тип категории (инструмент, жанр, настроение и так далее) и идентификатор категории.

Для определенного трека может быть неизвестное количество категорий. Например, трек с id = 1 может иметь категории инструментов 3 и 4, категории настроения 1, 2, 3 и так далее.

Мне нужно получить сортируемый (по названию, времени, цене или чему-то еще) список треков, который также использует ОГРАНИЧЕНИЕ (для разбивки на страницы), отфильтрованное по настроению или инструменту или любому другому типу (типам).

Кто-нибудь может помочь мне собрать такой запрос? Я понятия не имею, с чего начать.

Вот пример структуры таблицы:

Таблица ‘tracks’

  ---- --------- ------- ------ 
| id |  title  | Price | Time |
 ---- --------- ------- ------ 
|  1 | Title 1 |    10 |    0 |
|  2 | Title 2 |     9 |    1 |
|  3 | Title 3 |     8 |    2 |
 ---- --------- ------- ------ 
  

Таблица «категории»

      ---- ------------ ------------- ---------- 
    | id |    type    | category_id | track_id |
     ---- ------------ ------------- ---------- 
    |  1 | instrument |           1 |        1 |
    |  2 | instrument |          10 |        1 |
    |  3 | genre      |           1 |        1 |
    |  4 | mood       |          15 |        2 |
     ---- ------------ ------------- ---------- 
  

Я бы, конечно, использовал int в качестве типа категории, но я использую слова в качестве примера.

ОБНОВЛЕНИЕ о фатальном недостатке:

решение juergen d работает хорошо, но у него есть один фатальный недостаток. Если у меня есть все возможные инструменты, жанры и настроения в отдельном раскрывающемся списке, и я хочу отфильтровать трек с инструментом 1, настроением 2 и жанром 3, выбрав выпадающие списки. В списке показаны все треки, в которых есть инструмент 1 ИЛИ настроение 2 ИЛИ … не И.

Кто-нибудь может помочь мне изменить его?

Комментарии:

1. Вам нужен больший дизайн

2. Ваш дизайн имеет недостатки, и я надеюсь, что кто-нибудь даст вам правильный желаемый дизайн.

3. @user1365447 Я думаю, вам следует приложить больше усилий, чтобы самостоятельно придумать правильный желаемый дизайн

Ответ №1:

Лучший дизайн БД был бы

Таблица ‘tracks’

  ---- --------- ------- ------ 
| id |  title  | Price | Time |
 ---- --------- ------- ------ 
|  1 | Title 1 |    10 |    0 |
|  2 | Title 2 |     9 |    1 |
|  3 | Title 3 |     8 |    2 |
 ---- --------- ------- ------ 
  

Таблица «категории»

  ---- ------------ 
| id |    type    |
 ---- ------------ 
|  1 | instrument |
|  2 | genre      |
|  3 | mood       |
 ---- ------------ 
  

Таблица ‘track_categories’

  ------------- ------------------------- 
| category_id | sub_category | track_id | 
 ------------- ------------------------- 
|           1 |           3  |        1 |
|           1 |           1  |        1 |
|           3 |           1  |        1 |
|           2 |           3  |        2 |
 ------------- ------------------------- 
  

Затем вы можете запустить запрос (например, для жанровых треков)

 select t.*
from tracks t
join track_categories tc on tc.track_id = t.id
join categories c on c.id = tc.category_id
where c.type = 'genre'
  

И если вы хотите выбрать дорожки, имеющие определенную комбинацию типов, тогда используйте

 select t.title
from tracks t
join track_categories tc on tc.track_id = t.id
join categories c on c.id = tc.category_id
group by t.title
having sum(c.type = 'instrument' and tc.sub_category = 1) > 0
and sum(c.type = 'mood' and tc.sub_category = 2) > 0
and sum(c.type = 'genre' and tc.sub_category = 3) > 0
  

Комментарии:

1. Спасибо! Я буду использовать это! Как насчет запроса?

2. Я не согласен. В лучшем дизайне была бы таблица жанров, таблица настроений и таблица инструментов

3. Потому что «Например, трек с id = 1 может иметь категории инструментов 3 и 4, категории настроения 1, 2, 3 и так далее».

4. Как тогда будет выглядеть запрос?

5. @Strawberry: О, я пропустил это. Я обновил свой ответ, но только добавил еще один столбец в track_categories таблицу.