如何检索多个表相关的层次结构父子数据?

时间:2015-09-29 21:17:52

标签: mysql join hierarchical-data

我有一个网站,其中包含吉他课程和练习,按类别细分。所以你可以有类别scales。然后是课程scales lesson1,其中可能包含exercise1_1exercise1_2。同样适用于其他类别和练习课程。

课程和练习被视为节点(它是Drupal网站)。因此,有一个节点表,其中包含节点ID,节点类型(课程或练习)和标题。

这些节点的其他信息字段(课程/练习文本等)存储在每个字段的单独表中。例如,有一个drupal_field_data_description表,其中包含每节课和练习的说明。

类别存储在分类term表中。

类别之间的关系通过分类索引表来处理,该分类索引表建立了子父关系(因此您可以使用缩放,缩放 - >主要缩放等)。 对于我的问题,我只考虑一个类别的深度。

课程和练习的类别存储在表格drupal_field_data_field_category中,该表格将课程和练习映射到他们所属的类别。

练习课程子父母关系存储在将练习映射到课程的表格drupal_field_data_field_lesson中。

以下是示例数据:

类别(drupal_taxonomy_term_data):

tid vid name
1   2   Scales
2   2   Arpeggios

课程和练习(drupal_node):

nid type        title
1   lesson      Lesson1
2   lesson      Lesson2
3   exercise    Ex1_1
4   exercise    Ex1_2
5   exercise    Ex2_1
6   exercise    Ex2_2

课程和练习的说明字段(drupal_field_data_field_description):

entity_type     bundle   entity_id  field_description_value
node            lesson   1          Lesson1Summary
node            lesson   2          Lesson2Summary
node            exercise 3          Ex1_1Summary
node            exercise 4          Ex1_2Summary
node            exercise 5          Ex2_1Summary
node            exercise 6          Ex2_2Summary

将课程和练习映射到分类法(drupal_taxonomy_index):

nid tid
1   1
2   1
3   1
4   1
5   1
6   1

将课程和练习映射到类别(drupal_field_data_field_category)(由于分类索引,这个似乎几乎没有必要):

entity_type bundle   entity_id  field_category_tid
node        lesson   1          1
node        lesson   2          1
node        exercise 3          1
node        exercise 4          1
node        lesson   5          1
node        lesson   6          1

练习到课程的映射(drupal_field_data_field_lesson):

entity_type     bundle      entity_id   field_lesson_target_id
node            exercise    3           1
node            exercise    4           1
node            exercise    5           2
node            exercise    6           2

所以...有了这个结构,我无法弄清楚如何构建一个返回表单结果的查询

Lesson1 Lesson1Summary
Ex1_1 Ex1_1Summary
Ex1_2 Ex1_2Summary
Lesson2 Lesson2Summary
Ex2_1 Ex2_1Summary
Ex2_2 Ex2_2Summary

请注意,Lesson1和Lesson2属于同一类别。

我需要返回这样的数据,因为对于类别页面(没有子类别),我需要为每节课显示一个表格,以显示课程中的练习。

我可以在多个查询中完成所有这些操作,但我真的想要更好地理解SQL连接和分组。另外,我没有设置如上所示的结果集。我对所有结果集都持开放态度,让我能够按照我所说的方式随时显示数据(我将通过PHP进行)。

SQL fiddle is here

您如何建议构建此类查询以提取课程及其以合理方式分组的练习(例如,我如何在上面展示)?

似乎以这种方式获得课程和练习相当于一个自我联接,其他桌子上有各种内部联接,但我不能将它们拼凑在一起......

1 个答案:

答案 0 :(得分:0)

嗯,经过多次阅读,我想我已经明白了:

SELECT n.title, d.field_description_value, n.nid, l.field_lesson_target_id from drupal_node n

JOIN drupal_field_data_field_description AS d ON d.entity_id = n.nid

JOIN drupal_taxonomy_index AS t ON t.nid = n.nid

LEFT JOIN drupal_field_data_field_lesson AS l ON l.entity_id = n.nid

ORDER BY COALESCE(l.field_lesson_target_id, n.nid), l.field_lesson_target_id, n.nid

我基于this post

我的sqlfiddle is here

这对我来说绝对是一个新的领域,虽然上面的工作,我希望我理解ORDER BY和GROUP BY的细微差别,以了解在何处/如何使用它们。