Получение данных из трех таблиц в postgresql

#sql #postgresql

#sql #postgresql

Вопрос:

Я новичок в postgresql. У меня есть три таблицы

Таблица 1: учитель

 tid   | t_name  | t_gender
1     | Joe     | Male
2     | Mantera | Female
  

Таблица 2: school_location

 school_id     | location
    1         | Location1
    2         | Location2
    3         | Location3
    4         | Location4
    5         | Location5
    6         | Location6
  

Таблица 3: teachers_school_location

 school_id     |  tid  |      timings
     1        |   2   | 08:00 AM - 01:00 PM
     2        |   2   | 02:00 PM - 05:00 PM
     3        |   2   | 06:00 PM - 08:00 PM
     4        |   1   | 09:00 AM - 12:00 PM
     5        |   1   | 02:00 PM - 04:00 PM
  

Я хочу написать запрос для получения данных из этих трех таблиц следующим образом: (вывод в формате json путем вызова API)

Когда пользователь выбирает tid = 1, я хочу получить такой вывод

Пожалуйста, посмотрите на это изображение

Когда пользователь выбирает tid = 2, я хочу получить такой вывод

Пожалуйста, посмотрите на это изображение

Я использовал ВНУТРЕННИЕ СОЕДИНЕНИЯ для получения выходных данных (запрос приведен ниже), но проблема в том, что данные из таблицы teacher повторяются для каждого местоположения.

 select 
   teacher.t_name
   , teacher.t_gender
   , school_location.location
   , teachers_school_location.timings 
from teacher 
inner join teachers_school_location 
   on teacher.tid = teachers_school_location.tid 
inner join school_location 
   on school_location.school_id = teachers_school_location.school_id
where teacher.tid = 2;
  

Его вывод:

выходное изображение запроса

но мне нужен такой вывод:

желаемый результат

Как я могу добиться такого результата?

Комментарии:

1. Я не совсем уверен, о чем вы спрашиваете. Выходные данные SQL и JSON выглядят как представляющие в целом эквивалентные данные. Результирующий набор SQL никогда не будет выглядеть как JSON, поскольку это принципиально разные способы отображения данных. Вы спрашиваете, как преобразовать результирующий набор SQL в JSON?

2. Вы должны использовать функции json_object_agg postgresql.org/docs/9.4/functions-aggregate.html

Ответ №1:

как вы знаете, вы можете использовать встроенные функции JSON в Postgres для подготовки вашего JSON следующим образом:

  SELECT
    json_build_object('t_name', t.t_name, 't_gender', t.t_gender, 'locations', locations_json)
FROM
    (
        SELECT
            tl.tid
            , json_object_agg(location, timings) locations_json
        FROM
            school_location               l
            JOIN teachers_school_location tl
                ON l.school_id = tl.school_id
        WHERE
            tl.tid = 2
        GROUP BY
            tl.tid
    )            tt
    JOIN teacher t
        ON t.tid = tt.tid;
  

Комментарии:

1. @AsjadNoor добро пожаловать, пожалуйста, примите это как ответ, если он ответил на ваш вопрос, спасибо