Преобразование подзапроса для присоединения - PullRequest
1 голос
/ 16 февраля 2011

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

Таблица "public.chapters"

  Column   |          Type          |                           Modifiers                           
-----------+------------------------+---------------------------------------------------------------
 id        | integer                | not null default nextval('chapters_chapter_id_seq'::regclass)
 chapter   | character varying(255) | not null
 course_id | integer                | 
 published | boolean                | default false

Таблица "public.lessons"

   Column   |          Type          |                          Modifiers                          
------------+------------------------+-------------------------------------------------------------
 id         | integer                | not null default nextval('lessons_lesson_id_seq'::regclass)
 lesson     | character varying(255) | not null
 chapter_id | integer                | 
 published  | boolean                | default false

Таблица "public.questions"

  Column   |          Type          |                            Modifiers                            
-----------+------------------------+-----------------------------------------------------------------
 id        | integer                | not null default nextval('questions_question_id_seq'::regclass)
 template  | character varying(255) | not null
 wording   | character varying(255) | not null
 lesson_id | integer                | not null

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

select sum( num_of_questions ) as num_of_questions, 
       chapter_id 
 from ( select chapters.id as chapter_id,
               lesson_id, 
               count(*) as num_of_questions 
          from questions 
          JOIN lessons ON lessons.id = questions.lesson_id 
          JOIN chapters ON lessons.chapter_id = chapters.id 
      GROUP BY lesson_id, chapters.id  
      ORDER BY lesson_id, chapters.id) as foo 
group by  chapter_id;

Как, можно ли преобразовать этот запрос для использования соединения вместо подзапроса.

1 Ответ

2 голосов
/ 16 февраля 2011

Использование:

  SELECT c.id as chapter_id,
         COUNT(*) as num_of_questions 
    FROM CHAPTERS AS c
    JOIN LESSONS AS l ON l.chapter_id = c.id
    JOIN QUESTIONS AS q ON q.lesson_id = l.id
GROUP BY c.id

Нет необходимости в подзапросе - просто ослабьте предложение GROUP BY.

ORDER BY в вашем исходном запросе ничего не делает для вас, тратит ресурсы - если вы не используете LIMIT.

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