SQL语句编写求助:获取自关联分类的父级与子级名称
解决自关联分类表的JOIN查询问题
你需要对categories表做自连接(self-join),因为要同时获取子分类和它对应的父分类名称。你的思路方向是对的,但直接访问categories.parent.name是无效的——单表JOIN只能拿到当前行的字段值,要获取父分类的名称,必须再关联一次父分类的记录。
正确的SQL语句
SELECT parent_cat.name AS Categorie, sub_cat.name AS Subcategorie, fd.examplecol1, fd.examplecol2 FROM Fooddiary fd JOIN categories sub_cat ON fd.categorie = sub_cat.id LEFT JOIN categories parent_cat ON sub_cat.parent = parent_cat.id WHERE fd.examplecol1 = 'test';
语句细节解释
- 给
categories表起两个别名:sub_cat对应Fooddiary关联的子分类,parent_cat对应这个子分类的父分类,方便区分两次关联的同一张表。 - 第一个
JOIN关联Fooddiary和子分类,确保每条日记记录都能拿到对应的子分类信息。 - 用
LEFT JOIN关联父分类(而非内连接),是为了兼容顶级分类的情况——比如如果某条日记关联的是Fruit(parent为Null),此时Categorie会显示Null,避免丢失这类记录。 - 通过
AS关键字把字段重命名成你需要的输出格式:Categorie(父分类名称)、Subcategorie(子分类名称)。
原语句的问题所在
你之前的查询SELECT categories.name, categories.parent...中,categories.parent是子分类记录里存储的父ID数值,而不是父分类的名称。要拿到名称必须通过自连接,再次关联父分类的记录才能获取到对应的name字段。
示例数据验证
针对你给出的测试数据,这条语句会返回:
| Categorie | Subcategorie | examplecol1 | examplecol2 |
|---|---|---|---|
| Fruit | Banana | test | a |
| Fruit | Banana | test | b |
| Fruit | Apple | test | a |
完全符合你想要的输出格式。
内容的提问来源于stack exchange,提问作者cauchy000
相关产品推荐
相关产品推荐

