Sam*_*pta 5 mysql group-by phpmyadmin
我有一个以forms下列结构命名的表格 -
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
SomeGroup | SomeForm2 | SomePath2
------------------------------------
Run Code Online (Sandbox Code Playgroud)
我使用以下查询 -
SELECT * FROM forms GROUP BY 'GROUP'
Run Code Online (Sandbox Code Playgroud)
它只返回第一行 -
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
------------------------------------
Run Code Online (Sandbox Code Playgroud)
它不应该返回(或全部)吗?或者我(可能)错了?
egg*_*yal 13
如手册所述:
在标准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对于每个组都相同的情况.服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的.
在您的情况下,MySQL正在执行分组操作,但是(因为您选择了所有列,包括您未对查询进行分组的列),会为您提供每组中不确定的一条记录.
它只返回一行,因为你的GROUP列的值是相同的......这基本上是如何GROUP BY工作的。
顺便说一句,当使用GROUP BY其他列的聚合函数时,这是一种很好的形式,例如COUNT(), MIN(), MAX()。在 MySQL 中,如果您只指定列名,它通常会返回每个组的第一行;其他数据库不会喜欢那样。
谢谢大家指出我太盲目而看不到的明显错误。我最终替换GROUP BY为ORDER BY并包含一个WHERE子句以获得我想要的结果。这就是我一直打算使用的。愚蠢的我。
我的最终查询变成这样 -
SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16057 次 |
| 最近记录: |