【问题标题】:SQL Concat SubquerySQL Concat 子查询
【发布时间】:2015-08-10 23:41:50
【问题描述】:

我希望“user_names”是一个用户列表,但我无法将多个子查询项分配给“user_names”。如果子查询只返回 1 项,则它起作用,但如果它返回多个,则不起作用。

床头柜
[编号]
[1]
[2]
[3]

分配表:
[id, bed_id, user_id]
[1,1,1]
[2, 1, 2]

用户表:
[id, '用户名']
[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']

【问题讨论】:

  • 为什么不直接从作业中选择用户名?
  • 您使用的是哪个数据库?用于连接值的方法不同。很可能有一个重复的问题可以解决您的问题。
  • 请使用示例数据和所需结果编辑您的问题。
  • 我正在尝试获取分配列表和分配给每个用户的用户列表,因此我认为这是编写查询的最佳方式。数据库是 Postgres。
  • 但是基于数组的group_concat 替代方案呢?向我们展示您如何尝试它们以及发生了什么,您可以重新提出您的问题。

标签: sql postgresql subquery concatenation concat


【解决方案1】:

您所拥有的查询的一个问题是您正在按应用 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;""

【讨论】:

  • 这正是我所需要的。谢谢。
猜你喜欢
  • 2018-08-14
  • 2022-09-22
  • 2017-06-03
  • 2013-05-16
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
相关资源
最近更新 更多