2011-11-08 34 views
0

我在查询中使用了group by子句。我想通过参数获得未在组中指定的其他列如何获取此查询中的其他列

SELECT un.user, un.role 
FROM [Unique] un 
group by user, role 

在关于[Unique]的查询中共有7列。我如何获得其他列?

回答

3

在大多数数据库(MySQL的和SQLite是我所知道的例外),你可以不包括一组列,按Select,除非:

  1. 列包含在GROUP BY子句。

  2. 该列为合计在其中一个受支持的聚合函数中。

在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,那么您返回的每一行都是由组中的构成的。如果您包含不属于GROUP BY子句的列,那么您不会向引擎发送上的任何指令,其中表中要从该表读取的值。因此,大多数引擎不允许你运行这种SQL。 MySQL确实有结果,但我个人认为这是不好的做法。

+0

完美,我明白为什么我现在必须使用MAX。谢谢 – Luke101

0

你试过指定它们吗?

SELECT un.user, un.role, un.col3, un.col4 
FROM [Unique] un 
group by user, role 
0

您需要使用Order By来获得额外的列。或者最终通过指定组中的每一列。

1

你必须选择你想要的其他列的依据。如果同一个用户/角色存在多个条目,您是否想要第一个/最后一个/随机?您必须在其他列上做出选择,通过汇总它们或选择将它们包括在按语句组合中。

有些RDBMS确实提供了执行此操作的默认行为,但由于问题只是标记为SQL,所以我们不知道它是否适用。

0

使用LEFT JOIN来自我加入唯一或使用SELECTGROUP BY作为子查询。

相关问题