如何从SQL子查询返回数组?

时间:2019-06-10 16:35:57

标签: mysql sql arrays database subquery

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

这是我的查询:

$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";

因为人们有多个朋友,所以我需要它为每个人返回一系列朋友。我该怎么办?

2 个答案:

答案 0 :(得分:0)

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

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 :(得分:0)

(扩展@GordonLinoff的评论)

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

-编辑- 经过进一步的测试,我发现以下代码无法正常工作。但是序列化然后反序列化的想法仍然存在。

  

$ sql =“ SELECT CONCAT(r.first_name,'',r.last_name)作为名称,         GROUP_CONCAT(CONCAT(f.first_name,'',f.last_name)             分隔符'|' )作为朋友,来自friend_list r JOIN   friend_list f ON f.friend = r.id;“;

     

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

     

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