MySQL GROUP BY仅返回第一行

时间:2012-05-31 09:16:23

标签: mysql group-by phpmyadmin

我有一个名为forms的表格,其结构如下 -

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

我使用以下查询 -

SELECT * FROM forms GROUP BY 'GROUP'

它只返回第一行 -

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

它不应该同时返回(或全部)吗?或者我(可能)错了?

9 个答案:

答案 0 :(得分:13)

正如the manual所述:

  

在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中指定的非聚合列。例如,此查询在标准SQL中是非法的,因为选择列表中的name列未显示在GROUP BY中:

SELECT o.custid, c.name, MAX(o.payment)
  FROM orders AS o, customers AS c
  WHERE o.custid = c.custid
  GROUP BY o.custid;
     

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

     

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

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

答案 1 :(得分:3)

它只返回一行,因为GROUP列的值相同......基本上GROUP BY的工作方式。

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

答案 2 :(得分:1)

您的代码:

SELECT * FROM forms GROUP BY 'GROUP'

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

答案 3 :(得分:1)

就mysql而言,我刚刚通过命中解决了我的问题。试验

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

课程:Donot使用分号,我相信它使用冒号进行字符串搜索。从列名中删除冒号,它将按其值进行分组。但是你可以使用反引号转义例如。 ID

答案 4 :(得分:0)

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

答案 5 :(得分:0)

SELECT * FROM forms GROUP BY `GROUP` 

你的查询确实有用,这很奇怪

答案 6 :(得分:0)

上述结果有点正确,但并不完全。

您选择的所有列都不属于GROUP BY语句,必须通过某个函数(list of aggregation function from the MySQL docu)进行聚合。大多数情况下,它们与数字列一起使用。

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

答案 7 :(得分:0)

只有在查询中应用了Group bymaxminavg等任何群组功能时,才需要

sum子句表达式。您的查询未显示任何此类功能。这意味着您实际上不需要Group by子句。如果您仍然使用此类条款,您将只收到分组结果中的第一条记录。

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

答案 8 :(得分:0)

谢谢大家指出我看得太盲目的明显错误。我最后用GROUP BY替换了ORDER BY并添加了WHERE子句以获得我想要的结果。这就是我一直想要使用的东西。傻我。

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

SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'