SQLite не имеет функциональности "pivot", которая понадобится вам для начала, а часть "значений, разделенных запятыми", безусловно, является проблемой презентации, которую было бы абсурдным (и, возможно, неосуществимым) пытаться протолкнуть в любую базу данных слой, какой бы диалект SQL ни был задействован - это определенно часть работы, которую вы выполняете в клиенте, например средство отчетности или язык программирования.
Используйте SQL для доступа к данным и оставьте презентацию другим слоям.
Как вы получаете ваши данные
SELECT media.id, media.uri, people.name, people.role
FROM media
JOIN media_to_people ON (media.id = media_to_people.media_id)
JOIN people ON (media_to_people.people_id = people.id)
WHERE media.id = ?
ORDER BY people.role, people.name
(«?» - это один из способов указать параметр в SQLite, чтобы привязать его к определенному медиа-идентификатору, который вы ищете, в зависимости от вашего клиента); данные будут поступать из БД в ваш клиентский код в несколько строк, и ваш клиентский код может легко поместить их в нужную вам форму одного столбца.
Нам сложно сказать, как кодировать клиентскую часть, не зная ничего о среде или языке, который вы используете в качестве клиента. Но в Python, например:
def showit(dataset):
by_role = collections.defaultdict(list)
for mediaid, mediauri, name, role in dataset:
by_role[role].append(name)
headers = ['mediaid', 'mediauri']
result = [mediaid, mediauri]
for role in sorted(by_role):
headers.append('people(%s)' % role)
result.append(','.join(by_role[role]))
return ' '.join(headers) + '\n' + ' '.join(result)
даже это не совсем соответствует вашей спецификации - вы запрашиваете заголовки, такие как 'people (artist)', а также указываете, что роль закодирована как int, и не упоминаете способ перехода от int к строке «художник», так что, очевидно, невозможно точно соответствовать вашей спецификации ... но это настолько близко, насколько моя изобретательность может достичь; -).