使用聚合函数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
值从结果中排除。手册:
所有非 NULL 值的串联
The 元素的顺序 in CompanyIds
and Companies
是任意的,根据手册:
连接元素的顺序是任意的。
另请注意,“任意”与“随机”不同。group_concat
与其他聚合函数一样,按收到的顺序处理行集。没有任何ORDER BY
,该顺序由执行的任何查询计划决定。关系数据库的表中没有自然顺序(不能依赖插入顺序at all)。但这两个实例group_concat()
在相同的SELECT
列出进程行same以便第一个 ID 在CompanyIds
对应于第一个名称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 开始)。
Use the GROUP BY
列为领先ORDER BY
以获得最佳结果的表达式。
不要对派生表执行任何操作after可能会重新排列它的顺序(例如将子查询连接到另一个表等)
最后,请注意,其他 RDBMS 中的类似聚合函数的行为可能略有不同。有关的:
- 将一列的多个结果行连接成一个,并按另一列分组
- GROUP_CONCAT 排序依据