我正在尝试从我的数据库中查询一个人的名字及其所有朋友的列表。我需要他们的朋友列表位于与他们的行相邻的数组中,以进行格式化。
这是我的查询:
$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";
因为人们有多个朋友,所以我需要它为每个人返回一系列朋友。我该怎么办?
答案 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'])