我正在努力编写将返回产品,他们的群组和他们小组的父母的查询。
这是我的数据库架构:
一个产品只有一个与他直接相关的组,该组只能有一个与该组直接相关的父组。例如,我的结构如下所示:
Drinks
Alcohol drinks
Vodka
Jack Daniels
Non alcohol drinks
Pepsi
Juice
所以在上面的例子中:
该组的父组是Drinks
。
这意味着百事可乐的Id将被插入到表ArticleGroups
中,也会在同一行中插入直接相关的Group - GroupId,这意味着我需要将pepsi的GroupId与表组连接,其中是pepsi的父组所以我可以得到两组(非酒精饮料和饮料)。
这是我到目前为止所写的内容,但我不确定这是否可以这样做,这真让我感到困惑......
Select ---
From Articles as T1
Join ArticleGroups as T2 on T1.ArticleId = T2.ArticleId
Join Groups as T3 on T2.GroupId = T3.GroupId
Join Groups as T4 on T3.ParentId = T4.GroupId
我写的这个查询令我困惑,因为它看起来像......
从文章加入文章组中选择一些东西以获得与文章直接相关的组,之后加入组以获取该直接相关组的标题和其他信息,之后我应该再次加入组,因为在同一个表中作为parentId是文章组的主要组合。
这真让我感到困惑..
在我的选择中,我需要获得文章,他的直接相关群体(非酒精饮料)和非酒精饮料的父母,这就是饮料......所以很多人加入同桌,让我很困惑。
预期结果应如下所示:
正如你所看到的那样,我需要从Article表中获取产品标题,我还需要将表格组中的产品组加入到组中,并且我还需要获取表组中的文章组的父组。
重要事项: Group Drinks就像您可以看到非酒精饮料和酒精饮料的父母组,它在表格组中定义..
任何形式的帮助都会很棒,
谢谢!
答案 0 :(得分:0)
您的查询是正确的。如果你使用了更好的表别名,也许你会看到它更好:
Select a.*, g.name as subgroup, gp.name as parent_group
From Articles a left join
ArticleGroups ag
on ag.ArticleId = a.ArticleId left join
groups g -- lowest level group ("subgroup")
on ag.GroupId = g.GroupId left join
Groups gp -- parent group
on gp.GroupId = g.ParentId ;
我用外连接替换了内部连接,因此查询将返回所有文章,即使那些没有组或父组的文章。
数据结构没问题,但如果组开始拥有更多的层次结构,那么它会变得很麻烦