PostgreSQL: JOIN и GROUP BY, чтобы получить правильный результат запроса - PullRequest
0 голосов
/ 12 июня 2018

Я новичок в PostgreSQL, и я застрял в следующих запросах.

Желаемый результат будет

id |   name      | address | description | employees
1  |  'company1' | 'asdf'  |  'asdf'     | [{id: 1, name: 'Mark'}, {id: 2, name: 'Mark'}, {id: 3, name: 'Steve'}, {id: 4, name: 'Mark'}]
2 ...
3 ...
5  |  'company5' | 'asdf   | 'adsf'      | []

Мой текущий запрос (который не работает)

SELECT companies.* ,employees.*,json_agg(companies_employees.*) as "item"
FROM
  companies_employees
  JOIN companies ON companies_employees.COMPANY_id = companies.ID 
  JOIN employees ON companies_employees.EMPLOYEE_id = employees.ID
GROUP BY companies.ID, companies.NAME, companies.ADDRESS,companies.DESCRIPTION,employees.ID, employees.NAME

Есть 3 таблицы:

companies : ID, NAME, ADDRESS, DESCRIPTION
employees : ID, NAME, SALARY, ROLE
companies_employees : EMPLOYEE_ID, COMPANY_ID 
(CONSTRAINT companies_employees_employee_fkey FOREIGN KEY(employee_id) REFERENCES employees(id),
CONSTRAINT companies_employees_company_fkey FOREIGN KEY(company_id) REFERENCES companies(id) ) 

Пример таблицы [http://sqlfiddle.com/#!15/27982/29][here]

Возможно, «GROUP BY» не подходит для использования.

Не могли бы вы направить меня в правильном направлении?Большое спасибо заранее

1 Ответ

0 голосов
/ 12 июня 2018

http://sqlfiddle.com/#!15/8849a/1

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

SELECT
  companies.*,json_agg(employees.*) as "employees"
FROM
  companies_employees
  JOIN companies ON companies_employees.COMPANY_id = companies.ID
  JOIN employees ON companies_employees.EMPLOYEE_id = employees.ID
GROUP BY 
  companies.ID, 
  companies.NAME, 
  companies.ADDRESS,
  companies.DESCRIPTION
...