postgresql SQL Concat子查询

cmssoen2  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(190)

我希望“user_names”是一个用户列表,但我不能将多个子查询项分配给“user_names”。如果子查询只返回1项,则有效,但如果返回多项,则无效。
床上桌
[ID]
[1]第一章
[二]《中国日报》
[3]第一章
分配表:
[id,bed_id,user_id]
【一、一、一】
[二、一、二]
用户表:
[id,'user_name']
[1,“约翰·史密斯”]
[2,“无名氏”]

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,“]
我尝试硬编码床id并运行此段以获得名称列表。它不起作用:

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']

avkwfej4

avkwfej41#

这个查询的一个问题是,你是按照你应用array_agg的列进行分组的。如果你删除group by,你会得到"{"John Smith","Jane Doe"}",但是你仍然会丢失bed id列,如果你想要所有bed的列表,即使没有赋值,你应该使用左连接而不是子查询(这也应该更好地提高性能和可读性)。
您可以使用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;""

相关问题