我有一个网站,其中包含吉他课程和练习,按类别细分。所以你可以有类别scales
。然后是课程scales lesson1
,其中可能包含exercise1_1
,exercise1_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进行)。
您如何建议构建此类查询以提取课程及其以合理方式分组的练习(例如,我如何在上面展示)?
似乎以这种方式获得课程和练习相当于一个自我联接,其他桌子上有各种内部联接,但我不能将它们拼凑在一起......
答案 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
这对我来说绝对是一个新的领域,虽然上面的工作,我希望我理解ORDER BY和GROUP BY的细微差别,以了解在何处/如何使用它们。