【问题标题】:Fetch result as single array in single query在单个查询中将结果作为单个数组获取
【发布时间】:2016-10-08 08:07:24
【问题描述】:

我需要在单个查询中连接表并将输出作为单个数组获取,即使用户有多个地址

我的查询:

SELECT user.name, address.address, user.place 
FROM user 
LEFT JOIN address 
WHERE user.user_id = address.user_id 
GROUP BY user.name, address.address, user.place

假设用户有多个地址,目前正在以两行的形式输出。有没有办法使用单个查询将所有输出值收集到单个数组中。

请帮忙。

【问题讨论】:

  • SQL Server 真的接受这个说法吗?根据 ANSI SQL 的语法错误。
  • 添加一些示例表数据,结果是预期的。

标签: php sql sql-server join


【解决方案1】:

您可以在查询中使用group_concat

SELECT user.name, group_concat(address.address) as 'address', user.place 
FROM user 
LEFT JOIN address 
WHERE user.user_id = address.user_id

【讨论】:

  • 据我所知group_concat 是 MySQL 功能,而不是 SQL Server。
【解决方案2】:

试试FOR XML PATH(''),它将把你的地址连成一行:

select
    [user].[name],
    (select [address] + ', '
    from [address]
    where
        [user_id] = [user].[user_id]
    for xml path('')),
    user.place
from [user]

【讨论】:

    【解决方案3】:

    另一种方法是使用 FOR XML 语句:

    SELECT DISTINCT 
                u.name, 
                STUFF((SELECT ';' + a.[address]
                FROM address a
                WHERE u.[user_id] = a.[user_id]
                FOR XML PATH('')),1,1,'') as [address],
                u.place
    FROM [user] u
    

    输出如下:

    name    address         place
    Mike    adr1;adr2;adr3  someplace
    

    【讨论】:

    • 非常感谢您的帮助,我可以知道为什么这里是“a”,来自地址 a
    • 它是address 表的别名,这是引用表而不写全名的常用方法。您在查询中给出一次别名,然后在别名的帮助下引用表列。 F.e.在我的回答中,我给了addressauser 表-u 的别名。然后我写a.user_id 而不是address.user_id
    • 好的,谢谢。我写查询的经验不多。
    猜你喜欢
    • 2015-10-30
    • 2023-03-11
    • 2013-04-16
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多