我正在创建一个数据库来存储音乐。
有不同的类别,每个类别都有子类别。示例:
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。
这是否有可能,还是应该彻底检查数据库结构?我想看看你的建议。
答案 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