8

我有一个名为forms以下结构的表-

GROUP       | FORM       | FILEPATH
====================================
SomeGroup   | SomeForm1  | SomePath1
SomeGroup   | SomeForm2  | SomePath2
------------------------------------

我使用以下查询-

SELECT * FROM forms GROUP BY 'GROUP'

它只返回第一行-

GROUP       | FORM       | FILEPATH
====================================
SomeGroup   | SomeForm1  | SomePath1
------------------------------------

它不应该返回两者(或全部)吗?还是我(可能)错了?

4

9 回答 9

19

手册所述:

在标准 SQL 中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的非聚合列。例如,这个查询在标准 SQL 中是非法的,因为name选择列表中的列没有出现在GROUP BY

选择o.custid,c.name,MAX(o.payment)
  FROM 订单 AS o,客户 AS c
  WHERE o.custid = c.custid
  按 o.custid 分组;

为了使查询合法,该name列必须从选择列表中省略或在GROUP BY子句中命名。

MySQL 扩展了 的使用,GROUP BY以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 中命名的非聚合列中的所有值GROUP BY对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。

在您的情况下,MySQL 正确地执行了分组操作,但是(因为您选择了所有列,包括您未对查询进行分组的列)为您提供了每个组中不确定的一条记录。

于 2012-05-31T09:18:17.037 回答
6

它只返回一行,因为您的GROUP列的值是相同的......这基本上是如何GROUP BY工作的。

顺便说一句,在使用GROUP BY其他列时使用聚合函数是一种很好的形式,例如COUNT(), MIN(), MAX()。在 MySQL 中,如果您只指定列名,它通常会返回每个组的第一行;其他数据库不会喜欢这样。

于 2012-05-31T09:22:17.633 回答
2

就mysql而言,我只是通过hit & trial解决了我的问题。

10分钟前我遇到了同样的问题。我正在使用这样的mysql语句:

SELECT * FROM forms GROUP BY 'ID'; // returns only one row

但是,使用如下语句会产生相同的结果:

SELECT ID FROM forms GROUP BY 'ID'; // returns only one row

以下是我的解决方案:

SELECT ID FROM forms GROUP BY ID; // returns more than one row (with one column of field "ID") grouped by ID

或者

SELECT * FROM forms GROUP BY ID; // returns more than one row (with columns of all fields) grouped by ID

或者

SELECT * FROM forms GROUP BY `ID`; // returns more than one row (with columns of all fields) grouped by ID

教训:不要使用分号,我相信它会使用冒号进行字符串类型搜索。从列名中删除冒号,它将按其值分组。但是,您可以使用反引号转义,例如。ID

于 2013-10-10T00:37:10.677 回答
1

你的代码:

SELECT * FROM forms GROUP BY 'GROUP'

不是非常“好”的 SQL,MySQL 让您侥幸逃脱,只为 group by 子句中未提及的所有列返回一个值。几乎任何其他数据库都不会执行此查询。通常,任何不属于分组条件的列都必须与聚合函数一起使用。

于 2012-05-31T09:20:38.070 回答
0

查询结果完美;它只会返回一行。

于 2012-05-31T09:20:04.543 回答
0
SELECT * FROM forms GROUP BY `GROUP` 

奇怪的是您的查询确实有效

于 2012-05-31T09:20:50.253 回答
0

上面的结果是正确的,但并不完全正确。

您选择的所有不属于GROUP BY语句的列都必须由某个函数聚合(来自 MySQL 文档的聚合函数列表)。大多数情况下,它们与数字列一起使用。

除此之外,您的查询将为GROUP BY语句中引用的列中的每个(组合)属性返回一个输出行。在您的情况下,该列中只有一个不同的值GROUP,即“SomeGroup”,因此输出将仅包含该值的一行。

于 2012-05-31T09:21:57.347 回答
0

Group by仅当您在查询表达式中应用了任何组函数(例如max, min, avg,等)时才需要子句。sum您的查询未显示任何此类功能。这意味着您实际上不需要Group by子句。如果您仍然使用此类子句,您将只收到分组结果中的第一条记录。

因此,您查询的输出是完美的。

于 2012-05-31T09:22:17.550 回答
0

谢谢大家指出我太盲目看不到的明显错误。我终于替换GROUP BYORDER BY包含了一个WHERE子句来获得我想要的结果。这就是我一直打算使用的。傻我。

我的最终查询变成了这个-

SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'
于 2012-05-31T09:31:52.180 回答