我有一个表命名forms
有以下结构-
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
SomeGroup | SomeForm2 | SomePath2
------------------------------------
我用下面的查询 -
SELECT * FROM forms GROUP BY 'GROUP'
它仅返回第一行向
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
------------------------------------
难道不应该返回两个(或所有的话)? 还是我(可能)错了吗?
由于手动状态:
在标准的SQL,包括查询GROUP BY
子句中不能引用非聚合列在未在指定的选择列表中的GROUP BY
子句。 例如,因为此查询是标准的SQL非法name
在选择列表中列不会在出现GROUP BY
:
SELECT o.custid,c.name,MAX(o.payment) 从接单的O,客户为c WHERE o.custid = c.custid GROUP BY o.custid;
对于查询是合法的,该name
列必须从选择列表中被省略或在指定的GROUP BY
子句。
MySQL的扩展使用GROUP BY
,这样的选择列表可参考在未命名的非聚合列GROUP BY
子句。 这意味着,前面的查询是在MySQL中是合法的。 您可以使用此功能,避免不必要的列排序和分组,以获得更好的性能。 然而,当主要在未命名的每个非聚集列所有值,这是有用的GROUP BY
是为每个组相同。 该服务器是可以自由选择从每个组中的任何值,所以,除非它们是相同的,所选择的值是不确定的。
在你的情况下,MySQL正确地履行分组操作,但(因为你选择所有列,其中包括由你不是分组查询)为您提供了从每个组一个不确定的一个记录。
它只返回一行,因为你的价值观GROUP
列是相同的......这基本上是如何GROUP BY
的作品。
顺便说一句,当使用GROUP BY
这是很好的形式,以用于其他列聚合函数,如COUNT()
MIN()
MAX()
在MySQL 通常返回每个组的第一行,如果你只是指定的列名; 其他数据库不会喜欢,虽然。
您的代码:
SELECT * FROM forms GROUP BY 'GROUP'
是不是很“好”的SQL,MySQL的让您摆脱它,并返回只有一个GROUP BY子句中未提到的所有列的值。 几乎任何其他数据库不会执行此查询。 作为一项规则,任何列,这不是必须的聚集函数中使用的分组条件的一部分。
至于MySQL的来讲,我只是命中和试验解决我的问题。
我有同样的问题,11分钟前。 我采用的是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使用分号,我相信它用冒号一个stringtype搜索。 从列名删除冒号,它会被它的值组。 然而,你可以使用反引号逃脱如。 ID
SELECT * FROM forms GROUP BY `GROUP`
这是奇怪的是,您的查询不工作
上述结果是一种正确的,但并不完全。
选择所有列,这不是一部分GROUP BY
语句必须通过一些功能(汇总从MySQL实况聚合功能的列表 )。 它们大多与数字列一起使用。
除此之外,您的查询将返回每隔(组合)在引用的列属性的一个输出行GROUP BY
语句。 你的情况是存在的只是一个不同的值GROUP
列,即“SomeGroup”,所以输出将只包含该值一行。
Group by
如果您有任何组函数条款应只要求,说max
, min
, avg
, sum
等,查询表达式中使用。 您的查询没有显示出任何这样的功能。 这意味着你实际上不需要Group by
条款。 如果你还在用这样的条款,你会从分组的结果仅接收第一条记录。
因此,在您的查询的输出是完美的。
谢谢大家指出了明显的错误,我太盲目看。 我终于取代GROUP BY
与ORDER BY
,其中包括一个WHERE
子句,以获得我想要的结果。 这就是我打算一直使用。 愚蠢的我。
我最后的查询就会成为这 -
SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'