【问题标题】:How to return an array from a SQL subquery?如何从 SQL 子查询返回数组?
【发布时间】:2019-06-10 16:35:57
【问题描述】:

我正在尝试从我的数据库中查询人员姓名及其所有朋友的列表。为了格式化,我需要他们的朋友列表位于与他们的行相邻的数组中。

这是我的查询:

$sql = "SELECT CONCAT(r.first_name, ' ', r.last_name) as name, 
          ( SELECT CONCAT(first_name, ' ', last_name) as friend_name 
                FROM friend_list WHERE friend = r.id) as friends 
        FROM friend_list r";

因为人们有多个朋友,我需要这个来为每个人返回一组朋友。我该怎么做?

【问题讨论】:

  • MySQL 没有称为“数组”的数据类型,因此您不能这样做。但是,您可以将数据格式化为字符串或返回 JSON,然后解析出一个数组。
  • @GordonLinoff 感谢您的提示!我该怎么做?

标签: mysql sql arrays database subquery


【解决方案1】:

(扩展 @GordonLinoff 的评论)

无法直接检索数组。 您可以做的是使用GROUP_CONCAT 在查询中生成一个“序列化”数组,然后在您的应用程序上对其进行反序列化。

--编辑-- 经过进一步测试,我注意到以下代码无法按预期工作。但是序列化然后反序列化的想法仍然存在。

$sql = " SELECT CONCAT(r.first_name, ' ', r.last_name) 作为名称, GROUP_CONCAT ( CONCAT(f.first_name, ' ', f.last_name) 分隔符 '|' ) 作为朋友 FROMfriend_list r JOIN 朋友列表 f ON f.friend = r.id;" ;

并在 PHP 中“反序列化”它:

$friendsArray = explode('|', $r['friends'])

【讨论】:

  • 您缺少 GROUP BY 子句。
【解决方案2】:

在使用以下脚本之前,我回答了与此类似的问题。 逻辑将是相同的,只需更改表/字段名称以适合您的名称;

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',MAX(CASE WHEN UserName = ''' 
                    + p.UserName + ''' THEN FriendName END) AS ' 
                    + QUOTENAME(p.UserName) FROM Popular p
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @query = 'SELECT ' + @cols + ' FROM 
            (SELECT UserName, FriendName
                ,ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY FriendName) AS RowNum
                FROM Popular GROUP BY USERNAME, FRIENDNAME
            ) x
            GROUP BY RowNum'

EXECUTE(@query);

这将导致用户与他们的朋友在新行中按此列;

╔════════╦══════╦════════╗
║  John  ║ Khan ║ Philip ║
╠════════╬══════╬════════╣
║ Jeremy ║ Lemy ║ Brock  ║
║ Marry  ║ NULL ║ Ursula ║
║ Sarah  ║ NULL ║ NULL   ║
╚════════╩══════╩════════╝

原始线程可以在这里找到; SQL - Union All Users in One Table

【讨论】:

  • (1) 此答案适用于 SQL Server 而不是 MySQL。 (2) 如果您只想重复一个答案,只需将其作为副本关闭即可。 (3) 如果您想帮助用户,请针对他/她的问题调整答案。
猜你喜欢
  • 1970-01-01
  • 2017-10-17
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多