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
一个想法是切换到嵌套集模型一个想法是切换到嵌套集模型