Вложенная группа из нескольких таблиц SQL с использованием Ruby on Rails Active Record - PullRequest
0 голосов
/ 08 ноября 2018

Модели:

A survey имеет survey_answers, каждый из которых имеет answer и question

A question принадлежит category.

Пример:

Survey_answer имеет survey_id и answer_id и question_id

question имеет category_id

Я использую Ruby on Rails с Active Record

Используя SQL и начиная с опроса, как я могу сгруппировать следующим образом:

{ category => questions => answers }

Пример вывода:

{[
  category_one_record, 
    [question_1,[answer_1, answer_2]],
    [question_2,[answer_3, answer_4]],
  category_two_record, 
    [question_3,[answer_5, answer_6]],
    [question_4,[answer_7, answer_8]],
  category_three_record,
    ...
]}

Я понимаю, как создать группу, но не понимаю, как сделать вложенную группировку с SQL

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я полагаю, что вы думаете об этом не в стиле SQL.

SQL является табличным, и при возврате такого рода информации вполне обычно принимать повторение, а не пытаться сгенерировать вложенную структуру данных (например, это можно сделать с помощью JSON, XML и т. Д.).

Вы не появляются , чтобы хотеть какого-либо фактического агрегирования (для чего GROUP BY) . Вместо этого вы имеете в виду один способ хранить связанные записи рядом друг с другом.

Было бы просто присоединить данные и затем упорядочить их.

Ваш оригинальный пост не ясен по структурам таблицы, так что это очень грубый пример того, что я имею в виду ...

SELECT
  survey.name   AS survey_name,
  category.name AS category_name,
  question.text AS question_text,
  answer.text   AS answer_text
FROM
  survey
INNER JOIN
  question
    ON question.survey_id = survey.id
INNER JOIN
  category
    ON category.id = question.category_id
INNER JOIN
  answer
    ON answer.question_id = question.id
ORDER BY
  survey.name,
  category.name,
  question.text,
  answer.text

Такой запрос может затем вернуть набор записей, который выглядит следующим образом ...

 survey_name | category_name | question_text | answer_text
-------------+---------------+---------------+-------------
 survey_1    | category_1    | question_1    | answer_1
 survey_1    | category_1    | question_1    | answer_2
 survey_1    | category_1    | question_2    | answer_3
 survey_1    | category_1    | question_2    | answer_4
 survey_1    | category_2    | question_3    | answer_5

Табличное. Не вложенный.

0 голосов
/ 08 ноября 2018

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

select * from Survey_answer 
               natural join question 
               natural join category 
               where category_id = 1

Если у вас нет этой опции, вам нужно указать точки соединения, и если они справа, слева или внутри, например:

select * from Survey_answer 
               inner join question on Survey_answer.answer_id like  question.answer_id
               where Survey_answer.category_id = 1

Подробнее об этом вы можете узнать здесь: https://www.w3schools.com/sql/sql_join.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...