#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
таблицу.