2015-08-10 1 views
3

Я бы хотел, чтобы «user_names» был списком пользователей, но я не могу получить несколько элементов подзапроса, которые будут назначены «user_names». Это работает, если подзапрос возвращает только 1 элемент, но не работает, если он возвращает несколько.SQL Concat Subquery

Кровать Таблица
[ID]
[1]
[2]
[3]

Назначение Таблица:
[ID, bed_id, идентификатор_пользователя]
[1, 1, 1 ]
[2, 1, 2]

Пользователи Таблица:
[ID, 'user_name']
[1, 'John Smith']
[2, 'Jane Doe']

sql = "SELECT 
     b.id, 
     (
      SELECT 
       u.user_name 
      FROM 
       assignments AS a 
      INNER JOIN 
       users as u 
      ON 
       a.user_id = u.id 
      WHERE a.bed_id = b.id 
     ) AS user_names 
     FROM beds AS b" 

Желаемые результаты будут:
[1, 'Джон Смит, Джейн Доу']
[2, '']
[3, '']

Я пробовал жестко кодировать идентификатор кровати и запускать этот сегмент, чтобы получить список имен. Это не сработало:

sql = """ 
     (
     SELECT 
      array_agg(user_name) 
     FROM 
      roomchoice_assignment AS a 
     INNER JOIN 
      roomchoice_customuser as u 
     ON 
      a.user_id = u.id 
     WHERE 
      a.bed_id = 1 
     GROUP BY user_name 
     )""" 

Он вернулся следующее:

[ 
    [ 
     [ 
      "John Smith" 
     ] 
    ], 
    [ 
     [ 
      "Jane Doe" 
     ] 
    ] 
] 

Я надеялся на это:

['John Smith, Jane Doe'] 
+0

почему бы не просто выбрать user_name из заданий? – code

+1

Какую базу данных вы используете? Метод, используемый для конкатенации значений, различен. Скорее всего, будет дублированный вопрос, который будет решать ваш вопрос. – jpw

+0

Пожалуйста, отредактируйте свой вопрос с образцовыми данными и желаемыми результатами. –

ответ

2

Один вопрос с запросом у вас есть то, что вы группировка по столбцу, к которому вы применяете array_agg. Если вы удалите группу, вы получите "{"John Smith","Jane Doe"}", но вам все равно будет недоставать столбец id кровати, и если вам нужен список всех кроватей, даже если нет назначений, вы должны использовать левые соединения вместо подзапросов (что также должно быть лучше для производительности и удобочитаемости).

Вы можете использовать string_agg, как указано дублирующимся вопросом.

Этот запрос:

SELECT b.id, string_agg(u.user_name, ', ') users 
FROM beds AS b 
LEFT JOIN assignment AS a ON a.bed_id = b.id 
LEFT JOIN users as u ON a.user_id = u.id 
GROUP by b.id; 

даст вам результат, как:

1;"John Smith, Jane Doe" 
2;"" 
3;"" 
+1

Это именно то, что мне нужно. Благодарю. –