SQL选择父作为列名和子作为值

时间:2019-02-10 15:03:19

标签: 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              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

我被告知要使用树形结构,因为将来可能会添加其他类别,这应该能够支持。但是,我不知道如何编写查询以获取上面的结果。

首先选择乐器,然后选择solo_instrument时,我会得到想要的结果,但这都是硬编码的,并且当我单独选择音轨时,它不允许音轨只有一个parentID。

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

2 个答案:

答案 0 :(得分:0)

您应该可以使用条件聚合解决此问题。

查询:

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int product_id;
    private String naam, omschrijving;
    private double prijs;
    @OneToMany(mappedBy = "product_m")
    private List<Aanbieding> aanbiedingen;
    @OneToMany
    private List<Categorie> categories;
}

@Entity
public class Categorie {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int categorie_id;
    private String naam, omschrijving;
    @OneToMany
    private List<Product> producten;

}

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列。

this DB Fiddle demo 中包含示例数据,查询返回:

MAX()

答案 1 :(得分:0)

首先,您按table_music中的musicid进行分组,然后两次联接至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