Как объединить несколько уровней родительских таблиц с помощью GROUP BY на промежуточном родителе? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть структура, которая выглядит примерно так:

country:  | state:         | city:        | citizen:
    id    |    id          |    id        |    id
    name  |    name        |    name      |    age
          |    country_id  |    state_id  |    city_id
          |                |              |    

Результат, который мне нужен, выглядит примерно так:

country_name | state_name  | city_name | citizens
----------------------------------------------------
India        | MH          | Mumbai    | 45
USA          | California  | LA        | 234 
USA          | Washington  | Seattle   | 324

Я пытаюсь ответить на этот вопрос:

SELECT 
    country.name AS "country_name",
    state.name AS "state_name",
    city.name AS "city_name",
    count(citizen.id) AS "citizens"
FROM citizen
LEFT JOIN city on citizen.city_id = city.id
LEFT JOIN state on city.state_id = state.id
LEFT JOIN country on state.country_id = country.id
WHERE 
     citizen.age > 50
GROUP BY city_name;

Ошибка, которую мне дает Postgres, такова:

ERROR:  column "state.name" must appear in the GROUP BY clause
        or be used in an aggregate function
LINE 3: state.name AS "state_name",

Я не уверен, как достичь того, что мне нужно.

1 Ответ

0 голосов
/ 04 мая 2018

Я бы сделал это как отдельный joins

select cn.name as country_name, st.name as state_name, 
       ct.name as city_name, c.citizens
from (
     select city_id, count(*) as citizens
     from citizen
     where age > 50
     group by city_id
) c left join city ct on ct.id  = c.city_id
left join state st on st.id = ct.state_id
left join country cn on cn.id = st.country_id; 
...