SQL Выберите родителя в качестве имени столбца и дочернего в качестве значения - PullRequest
0 голосов
/ 10 февраля 2019

Я создаю базу данных для хранения музыки.

Существуют разные категории, у каждой из которых есть подкатегории.Пример:

id    name                  parentID
1     instrumentation       null
2     solo_instrument       null
3     Concert Band          1
4     Brass Band            1
5     Fanfare Band          1
6     Clarinet              2
7     Saxophone             2
8     Trumpet               2

С другой стороны, у меня есть таблица, в которой хранится musicID, связанный с categoryID

id    categoryID  musicID
1     4           1
2     8           1
3     3           2
4     6           2

Мне нужен следующий результат запроса:

musicID    instrumentation    solo_instrument
1          Brass Band         Trumpet
2          Concert Band       Clarinet

Мне сказали использовать древовидную структуру, так как в будущем, вероятно, будут добавлены другие категории, и это должно быть в состоянии поддержать это.Тем не менее, я не могу понять, как написать запрос, чтобы получить результат выше.

Я вроде получаю результат, который хочу получить, выбирая сначала инструментарий, затем solo_instrument, но это все жестко закодировано ине позволяет музыкальным трекам иметь только один родительский идентификатор, так как я выбираю их по отдельности.

Возможно ли это вообще или я должен пересмотреть структуру своей базы данных?Я хотел бы видеть ваши рекомендации.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Сначала вы группируете по musicid в table_music и дважды соединяетесь с table_categories:

select t.musicid, c1.name instrumentation, c2.name solo_instrument
from (
  select musicid, min(categoryid) instrumentationid, max(categoryid) solo_instrumentid
  from table_music
  group by musicid
) t inner join table_categories c1
on c1.id = t.instrumentationid
inner join table_categories c2
on c2.id = t.solo_instrumentid
order by t.musicid
0 голосов
/ 10 февраля 2019

Вы должны быть в состоянии решить эту проблему, используя условное агрегирование .

Запрос:

SELECT
    mu.musicID,
    MAX(CASE WHEN cp.name = 'instrumentation' THEN ca.name END) instrumentation,
    MAX(CASE WHEN cp.name = 'solo_instrument' THEN ca.name END) solo_instrument
FROM
    musics mu
    INNER JOIN categories ca ON ca.id = mu.categoryID
    INNER JOIN categories cp ON cp.id = ca.parentID
GROUP by mu.musicID

INNER JOIN s поднимает соответствующую категорию, а затемподнимается на один уровень вверх, чтобы найти родительскую категорию.Если создаются новые корневые категории, вам просто нужно добавить в запрос больше MAX() столбцов.

В этой демонстрации DB Fiddle с примерами данных,запрос возвращает:

| musicID | instrumentation | solo_instrument |
| ------- | --------------- | --------------- |
| 1       | Brass Band      | Trumpet         |
| 2       | Concert Band    | Clarinet        |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...