2015-09-29 3 views
0

У меня есть сайт, который содержит уроки игры на гитаре и упражнения, разбитые по категориям. Таким образом, вы можете иметь категорию scales. Затем урок scales lesson1, который может содержать exercise1_1, exercise1_2. Аналогично для других категорий и занятий с упражнениями.Как получить иерархические данные родитель-ребенка, связанные несколькими таблицами?

Уроки и упражнения считаются узлами (это сайт Drupal). Таким образом, есть таблица узлов, в которой есть идентификаторы узлов, тип узла (урок или упражнение) и названия.

Другие поля информации для этих узлов (текст урока/упражнения и т. Д.) Хранятся в отдельных таблицах для каждого поля. Например, есть таблица 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

Как бы вы рекомендовать создание такого запроса, чтобы извлечь урок и его упражнения сгруппированы в логическом порядке (например, как я показываю выше)?

Кажется получать уроки и упражнения в этом случае было бы равнозначно автообъединение, с различными внутренних соединений на другие таблицы, но я просто не могу собрать все вместе это ...

ответ

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, чтобы понять, где и как их использовать.

Смежные вопросы