Как вернуть массив из подзапроса SQL? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь запросить список имен людей и всех их друзей из моей базы данных. Мне нужно, чтобы их список друзей был в массиве рядом с их строкой для целей форматирования.

Вот мой запрос:

$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 голосов
/ 10 июня 2019

(Расширение комментария @GordonLinoff)

Нет способа напрямую получить массив. Что вы можете сделать, это сгенерировать «сериализованный» массив внутри запроса, используя GROUP_CONCAT, а затем десериализовать его в вашем приложении.

- EDIT-- После дальнейшего тестирования я заметил, что приведенный ниже код работает не так, как задумано. Но идея сериализации, а затем десериализации остается в силе.

$ sql = "SELECT CONCAT (r.first_name, '', r.last_name) в качестве имени, GROUP_CONCAT (CONCAT (f.first_name, '', f.last_name) СЕПАРАТОР '|' ) в друзья из FROM friend_list r ПРИСОЕДИНЯЙТЕСЬ список друзей f ON f.friend = r.id; ";

И чтобы "десериализовать" его в PHP:

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

0 голосов
/ 10 июня 2019

Я ответил похожим на это перед использованием приведенного ниже сценария.Логика будет такой же, просто измените имена таблиц / полей, чтобы они соответствовали вашему;

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 - объединение всех пользователей в одну таблицу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...