我在查询中使用group by
子句。我想通过参数
SELECT un.user, un.role
FROM [Unique] un
group by user, role
在有关[Unique]的查询中共有7列。我如何获得其他列?
答案 0 :(得分:3)
在大多数数据库中(MySQL和SQLite是我所知的例外),除非以下情况,否则不能在GROUP BY SELECT中包含列:
该列包含在GROUP BY子句中。
该列在其中一个受支持的聚合函数中聚合。
在MySQL和SQLite中,从中获取额外值的聚合组内的行是未定义的。
如果您想在任何其他引擎中添加额外的列,可以将列名称包装在MAX()中:
SELECT un.user, un.role, MAX(un.city), MAX(un.bday)
FROM [Unique] un
GROUP BY user, role
在这种情况下,额外列的值可能来自输入记录集中的不同行。如果这很重要(有时不是因为额外的列来自一对多JOIN的一侧),你就不能使用这种技术。
为了清楚起见:如果在SELECT中使用GROUP BY,那么您获取的每一行都是由您正在选择的表中的多行 groups 构成的。如果包含不属于GROUP BY子句的列,则不会向引擎提供有关的任何指令的说明,而这些行是您希望从中读取该值的表。因此,大多数引擎都不允许您运行这种SQL。 MySQL确实有未定义的结果,但我个人认为这样做是不好的做法。
答案 1 :(得分:1)
您必须选择其他列的基础。如果同一用户/角色存在多个条目,您想要第一个/最后一个/随机吗?您必须通过聚合它们或选择将它们包含在group by语句中来对其他列进行选择。
某些RDBMS确实提供了执行此操作的默认行为,但由于问题只是标记为SQL,我们不知道它是否适用。
答案 2 :(得分:0)
您是否尝试过指定它们?
SELECT un.user, un.role, un.col3, un.col4
FROM [Unique] un
group by user, role
答案 3 :(得分:0)
您需要使用Order By来获取额外的列。或者您最终指定组中的每一列。
答案 4 :(得分:0)
使用LEFT JOIN
自我加入Unique,或使用SELECT
GROUP BY
作为子查询。