Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.185.123] |
|
Данный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|||||||||||||||||||||||||||||||
|
Есть проблемка, не знаю куда копать. Есть таблицы A и B:
Таблица-A
Таблица-B
В результате запроса нужно получить:
Вобщем вопрос - как "собирать" поле "Users"? Пока формирую на клиенте, но не нравится это, чую, что не по-фэншую |
Сообщ.
#2
,
|
|
|
Посмотри агрегатные функции - возможно, string_agg како-то удастся совместить с группировкой по B.ID...
В крайнем случае, используй её в коррелирующем подзапросе. |
Сообщ.
#3
,
|
|
|
Цитата JoeUser @ что не по-фэншую На один-два пойдет, а если для "один" наберет 1 000 000 Ивановых и Петровых? Потянет PostrgeSQL такую строчку? |
Сообщ.
#4
,
|
|
|
Цитата Akina @ Посмотри агрегатные функции - возможно, string_agg како-то удастся совместить с группировкой по B.ID... В крайнем случае, используй её в коррелирующем подзапросе. Огромное спасибо, все нормуль! Получилось вот так: SELECT a."Id", a."Name", array_to_string(array_agg(b."User"), ', ') as "Users" FROM public."A" AS a LEFT JOIN public."B" AS b ON a."Id" = b."Id" GROUP BY a."Id" ORDER BY a."Id" |
Сообщ.
#5
,
|
|
|
Уж совсем чтобы для феншуя можешь ещё сортировку в группе добавить...
|
Сообщ.
#6
,
|
|
|
Цитата Bas @ На один-два пойдет, а если для "один" наберет 1 000 000 Ивановых и Петровых? Потянет PostrgeSQL такую строчку? Точно не помню, но на слуху цифра - максимальная длина строки в Постгрессе - 400Gb. Значит потянет. По моей БД и не близко не будет. Пользователей максимум -100-150. Добавлено Цитата Akina @ Уж совсем чтобы для феншуя можешь ещё сортировку в группе добавить... Я знал что твое кунг-фу сильнее Релиз: SELECT a."Id", a."Name", array_to_string(array_agg(b."User" ORDER BY b."User"), ', ') as "Users" FROM public."A" AS a LEFT JOIN public."B" AS b ON a."Id" = b."Id" GROUP BY a."Id" ORDER BY a."Id" |
Сообщ.
#7
,
|
|
|
Bugfix!
... array_to_string(array_agg(DISTINCT b."User" ORDER BY b."User"), ', ') as "Users" ... |
Сообщ.
#8
,
|
|
|
JoeUser
А откуда на таком запросе может вылезать дублирование? Неужели у тебя в левой таблице ID неуникален? |
Сообщ.
#9
,
|
|
|
Цитата Akina @ Неужели у тебя в левой таблице ID неуникален? Левая таблица (ну вощем Таблица-B) - сборная, формируется сложением запросов через UNION. Много дублей. |