2012-05-23 3 views
1

У меня есть несколько таблиц:SQL Group LEFT JOIN результат

Пользователи

ID

Настройки

user_id

Я хочу, чтобы вернуть данные пользователя наряду со всеми настройками для данного пользователя, доступными в результате и er 'index', это возможно?

ответ

3

Postgresql имеет ARRAY_AGG функцию, которая делает конкатенацию для вас. например

SELECT Users.ID, 
     ARRAY_AGG(COALESCE(Name || ' : ' || Value, '')) AS Settings 
FROM Users 
     LEFT JOIN Settings 
      ON Users.ID = Settings.User_ID 
GROUP BY Users.ID 

Ваша структура таблицы была немного расплывчато, так что выше, основан на схеме я создал на SQL Fiddle

1

Если у вас есть индекс в user_id колонке, вы могли бы сделать что-то вроде этого:

select u.*, s.* 
from Users u 
inner join Settings s on (u.id = s.user_id); 
1

Следующий запрос должен делать то, что вы хотите, если я хорошо понял ...

SELECT Users.*, Settings.* 
FROM Users 
JOIN Settings ON Settings.user_id = Users.id 
+0

Это работает, но то, что я хочу сделать, это для каждого пользователя возвращает одну строку с их параметрами, сгруппированных под «настройками» в результате. –

+0

Итак, у вас есть дополнительные настройки, связанные с одним пользователем? – aleroot

1

Попробуйте GROUP_CONCAT

Как в mysql?

SELECT u.id, GROUP_CONCAT(s.id) 
FROM Users u 
INNER JOIN Settings s ON u.id = s.user_id 
GROUP BY u.id; 

EDIT: версия

PostgreSQL:

SELECT u.id, STRING_AGG(s.id) 
FROM Users AS u 
INNER JOIN Settings AS s ON u.id = s.user_id 
GROUP BY u.id; 
+2

PostgreSQL не имеет функции 'group_concat'. Эквивалентная функция PostgreSQL - 'string_agg' –