загрузка нескольких отношений в одном запросе PostgreSQL - PullRequest
0 голосов
/ 21 февраля 2019

Существует 4 таблицы.

  1. Snapmails
    • Пользователь
    • Snapmail камеры
      • Камеры

когда пользователь добавляет Snapmail, допустим, что идентификатор пользователя равен 41, а созданный Snapmail имеет id из 1. Он создал Snapmail для 5 камер, и они имеют идентификаторы как1, 2, 3, 4, 5

теперь snapmail в БД будет выглядеть как

ID | user_id | 
1  |   41    |

, а snapmail_cameras будет иметь

ID | camera_id | snapmail_id
 1 |     1     |     1
 2 |     2     |     1
 3 |     3     |     1
 4 |     4     |     1
 5 |     5     |     1

Я пытаюсь получить всеsnapmails, который довольно прост, select * from snapmails, но я хочу, чтобы в нем было еще 2 элемента.

Имя пользователя и Имя камеры.

Я пробовал это.

SELECT sm.*, u.firstname || ' ' || u.lastname as fullname,cam.name
FROM snapmails as sm
INNER JOIN users as u ON sm.user_id = u.id
LEFT JOIN snapmail_cameras as sc ON sm.id = sc.snapmail_id
LEFT JOIN cameras as cam ON sc.camera_id = cam.id

Это дает мне то, что я хочу, но по-другому.Я хочу получить снимок из базы данных, такой как

 ID  | fullname | camera_names
 1   | Junaid F.|  Camera1, Camera2, Camera3

, но мой запрос дает мне как

 ID  | fullname | camera_name
 1   | Junaid F.|  Camera1
 1   | Junaid F.|  Camera2
 1   | Junaid F.|  Camera3
 1   | Junaid F.|  Camera4
 1   | Junaid F.|  Camera5

таблица камеры имеет столбец name, а таблица пользователя имеет 2 столбца firstname и lastname.Мой запрос дает мне все результаты, кроме одной строки для каждой камеры, но я хочу иметь одну строку со всеми названиями камер.это возможно?

ОБНОВЛЕНИЕ: я работаю в Ecto Можно ли обернуть это все в Ecto Query?

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете использовать string_agg:

SELECT sm.id, u.firstname || ' ' || u.lastname as fullname, string_agg(cam.name, ',')
FROM snapmails as sm
INNER JOIN users as u ON sm.user_id = u.id
LEFT JOIN snapmail_cameras as sc ON sm.id = sc.snapmail_id
LEFT JOIN cameras as cam ON sc.camera_id = cam.id
group by 1, 2
...