Mysql SQL选择父项作为列名,选择子项作为值

Mysql SQL选择父项作为列名,选择子项作为值,mysql,sql,Mysql,Sql,我正在创建一个数据库来存储音乐 有不同的类别,每个类别都有子类别。例如: id name parentID 1 instrumentation null 2 solo_instrument null 3 Concert Band 1 4 Brass Band 1 5 Fanfare Band 1 6 Clarinet

我正在创建一个数据库来存储音乐

有不同的类别,每个类别都有子类别。例如:

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
另一方面,我有一个存储链接到categoryID的musicID的表

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
我被告知要使用树结构,因为将来可能会添加其他类别,这应该能够支持这一点。但是,我不知道如何编写查询以获得上述结果

当我选择第一个乐器,第二个独奏乐器时,我得到了我想要的结果,但这都是硬编码的,不允许音乐曲目只有一个parentID,因为我单独选择它们


这是可能的还是我应该彻底检查我的数据库结构?我想看看您的建议。

您应该能够使用条件聚合解决这个问题

查询:

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
内部联接
s拉起相应的类别,然后上升一级以查找父类别。如果创建了新的根类别,则只需向查询中添加更多的
MAX()

在带有示例数据的中,查询返回:

| musicID | instrumentation | solo_instrument |
| ------- | --------------- | --------------- |
| 1       | Brass Band      | Trumpet         |
| 2       | Concert Band    | Clarinet        |

您应该能够使用条件聚合来解决这个问题

查询:

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
内部联接
s拉起相应的类别,然后上升一级以查找父类别。如果创建了新的根类别,则只需向查询中添加更多的
MAX()

在带有示例数据的中,查询返回:

| musicID | instrumentation | solo_instrument |
| ------- | --------------- | --------------- |
| 1       | Brass Band      | Trumpet         |
| 2       | Concert Band    | Clarinet        |

首先,您在table_music中按music进行分组,然后两次加入table_类别:

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

首先,您在table_music中按music进行分组,然后两次加入table_类别:

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

一个想法是切换到嵌套集模型一个想法是切换到嵌套集模型