我有一个名为forms
的表格,其结构如下 -
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
SomeGroup | SomeForm2 | SomePath2
------------------------------------
我使用以下查询 -
SELECT * FROM forms GROUP BY 'GROUP'
它只返回第一行 -
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
------------------------------------
它不应该同时返回(或全部)吗?或者我(可能)错了?
答案 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 by
,max
,min
,avg
等任何群组功能时,才需要 sum
子句表达式。您的查询未显示任何此类功能。这意味着您实际上不需要Group by
子句。如果您仍然使用此类条款,您将只收到分组结果中的第一条记录。
因此,您的查询输出是完美的。
答案 8 :(得分:0)
谢谢大家指出我看得太盲目的明显错误。我最后用GROUP BY
替换了ORDER BY
并添加了WHERE
子句以获得我想要的结果。这就是我一直想要使用的东西。傻我。
我的最终查询变成了这个 -
SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'