Используйте для этого агрегатную функцию group_concat(X)
:
SELECT (a.LastName || " " || a.FirstName) AS AttendeeName
, a.PhotoURI
, group_concat(c.CompanyName) AS Companies
, group_concat(c.CompanyId) AS CompanyIds
FROM Attendee AS a
JOIN CompanyAttendeeRelation AS ca ON ca.AttendeeId = a.AttendeeId
JOIN Company AS c ON c.CompanyId = ca.CompanyId
GROUP BY a.LastName, a.Firstname, a.PhotoURI;
(Использование псевдонимов таблиц, чтобы сделать его короче и легче для чтения.)
NULL
значения исключаются из результата. Руководство:
объединение всех ненулевых значений
Порядок элементов в CompanyIds
и Companies
является произвольным, согласно руководству :
Порядок составных элементов произвольный.
Также обратите внимание, что «произвольный» - это не то же самое, что «случайный». group_concat
, как и другие агрегатные функции, обрабатывает набор строк в полученном порядке. Без ORDER BY
этот порядок определяется тем, какой план запроса выполняется. В таблицах реляционных баз данных нет естественного порядка (вы не можете полагаться на порядок вставки вообще ). Но оба экземпляра group_concat()
в одном и том же SELECT
списке обрабатывают строки в одинаковом порядке , так что 1-й идентификатор в CompanyIds
соответствует 1-му имени в Companies
.
Вы можете наложить свой заказ с помощью ORDER BY
в подзапросе. Это деталь реализации, но вряд ли она изменится. Как:
SELECT (LastName || " " || FirstName) AS AttendeeName
, PhotoURI
, group_concat(CompanyName) AS Companies
, group_concat(CompanyId) AS CompanyIds
FROM (
SELECT a.LastName, a.FirstName, a.PhotoURI, c.CompanyName, c.CompanyId
FROM Attendee AS a
JOIN CompanyAttendeeRelation AS ca ON ca.AttendeeId = a.AttendeeId
JOIN Company AS c ON c.CompanyId = ca.CompanyId
ORDER BY 1,2,3,4,5 -- or whatever you need
) AS sub
GROUP BY LastName, Firstname, PhotoURI;
Руководство о (необязательных) порядковых номерах в ORDER BY
:
Если выражение ORDER BY является константным целым числом K, то это выражение считается псевдонимом для K-го столбца набора результатов (столбцы нумеруются слева направо, начиная с 1).
Используйте список GROUP BY
в качестве ведущих ORDER BY
выражений для достижения наилучших результатов.
Ничего не делать с производной таблицей после упорядочения, которое может изменить его структуру (например, присоединение подзапроса к другой таблице и т. Д.)
Наконец, обратите внимание, что похожие агрегатные функции в других СУБД могут вести себя немного иначе. Связанный: