我希望“user_names”成为用户列表,但我无法将多个子查询项分配给“user_names”。如果子查询仅返回 1 项,则有效,但如果返回多项,则无效。
床头桌
id
1
2
3
分配表:
id bed_id user_id
1 1 1
2 1 2
用户表:
id user_name
1 'John Smith'
2 'Jane Doe'
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, 'John Smith, Jane Doe']
[2, '']
[3, '']
我尝试对床 ID 进行硬编码并运行此段以获取名称列表。没有成功:
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']
您的查询的一个问题是您正在按应用 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;""