I’m new to postgresql. I have three tables
Table1: teacher
x
tid | t_name | t_gender
1 | Joe | Male
2 | Mantera | Female
Table2: school_location
school_id | location
1 | Location1
2 | Location2
3 | Location3
4 | Location4
5 | Location5
6 | Location6
Table3: 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
I want to write a query to get data from these three tables like this: (output in json by calling an API)
When user select tid = 1, I want output like this
When user select tid = 2, I want output like this
I used INNER JOINS to get an output (query is given below), but the problem is that data from teacher table is repetitive for each location.
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;
Its output is:
but I need an output like this:
How can I achieve this output?
Advertisement
Answer
as you know you can use built-in JSON functions in Postgres to prepare your JSON like so:
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;